Java - 实例化可运行的内部循环



我想为报警应用程序创建多个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(是空的。

最新更新