Java - 实例化 Runnable 内循环

Java - Instantiate Runnable Inside Loop

我想为警报应用程序创建多个 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);
        }
    }
}

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

您的问题可能是您在 Runnable 中使用了 i。在你的 Runnable 被执行时, i 的值应该等于 counts,所以 Runnuble 中的 getDays().get(i) 实际上应该抛出一个 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

中使用它

可能主程序在线程启动前关闭。添加 Thread.sleep(5000),在:

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

或者您的列表 (getDays) 可能是空的。