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