Java - 实例化Runnable Inside Loop

时间:2017-08-10 22:06:06

标签: java multithreading javafx runnable

我想为警报应用程序创建多个Runnable对象,该对象将在用户指定的时间内执行任务。

我尝试在循环内部执行此操作,如下所示:

ScheduledExecutorService wait;
List<Runnable> listens = new ArrayList<>();
int i;
private void playAlarmOnInit(){
wait = Executors.newScheduledThreadPool(3);
    // loop through the tasks to get times            
    int counts = getDays().size();        
    for(i = 0; i < counts; i++){
        if(!getDays().get(i).isEmpty()) {
        Runnable listen = new Runnable() {
            @Override
            public void run() {
                if(!getDays().get(i).equals("Everyday")) {
                    System.out.println(getDays().get(i) + " " + getTimes().get(i));                                        
                } else {
                    DateFormat format = new SimpleDateFormat("d-M-yyyy");
                    Date date = new Date();
                    String time = format.format(date);
                    System.out.println(time + " " + getTimes().get(i)); 
                }
//                System.out.println(" " + getTimes().get(i)); 
                    }
            };
            wait.scheduleAtFixedRate(listen, 0, 1, TimeUnit.SECONDS);
        }
    }
}

它什么也没做。 为什么上面的代码不起作用?

2 个答案:

答案 0 :(得分:2)

您的问题可能是您在i中使用Runnable。在您Runnable执行时,i的值应该等于counts,因此getDays().get(i)中的Runnuble实际上应该IndexOutOfBoundException }}。尝试使用try-catch并检查是否存在异常。要解决此问题,您应该创建一个新的最终变量并在Runnable

中使用它
if(!getDays().get(i).isEmpty()) {
    final int runnableI = i;
    Runnable listen = new Runnable() {
         @Override
        public void run() {
            if(!getDays().get(runnableI).equals("Everyday")) {
            ....

或者您甚至可以将这一天存储为最终变量:

final String day = getDays().get(i);

并在Runnable

中使用它

答案 1 :(得分:-1)

也许主程序在线程启动之前关闭。添加Thread.sleep(5000),之后:

wait.scheduleAtFixedRate(listen, 0, 1, TimeUnit.SECONDS);
Thread.spleep(5000)

或者您的列表(getDays)为空。