我想为警报应用程序创建多个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);
}
}
}
它什么也没做。 为什么上面的代码不起作用?
答案 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)为空。