java工作线程中的无限循环无法通过ScheduledExecutorService暂停
大家好,我有一个问题,关于一连串的神灯问题。该程序将显示一串精灵灯光,并无限地浏览灯光对象集合,打开和关闭它们 我已经实现了在ScheduledExecutorService中执行,并将执行器的初始延迟设置为零,进一步延迟30秒java工作线程中的无限循环无法通过ScheduledExecutorService暂停,java,multithreading,Java,Multithreading,大家好,我有一个问题,关于一连串的神灯问题。该程序将显示一串精灵灯光,并无限地浏览灯光对象集合,打开和关闭它们 我已经实现了在ScheduledExecutorService中执行,并将执行器的初始延迟设置为零,进一步延迟30秒 ScheduledExecutorService executor = Executors.newScheduledThreadPool(2); `ScheduledFuture sequenceFutre = executor.scheduleWithFixedDel
ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
`ScheduledFuture sequenceFutre = executor.scheduleWithFixedDelay(sequenceRunnable, 0, 30, TimeUnit.SECONDS);`
我有这样的灯光数组列表循环
try {
while (!pause) {
for (int i = 0; i < theLights.size(); i++) {
Light light = theLights.get(i);
System.out.println(String.format(outputstr, (i + 1), light.turnOn()));
Thread.sleep(HALF_SECOND_INTERVAL);
System.out.println(String.format(outputstr, (i + 1), light.turnOff()));
}
}
} catch (InterruptedException ie) {
ie.printStackTrace();
} catch(Error err) {
err.printStackTrace();
}
试试看{
当(!暂停){
对于(int i=0;i
我在这里缺少的部分是,包装在其中的runnable似乎不会在30秒时停止,并在恢复之前等待30秒,这是必需的
有人能帮忙吗?我缺少什么?每次执行都会调用runnablerun()
方法。您不应该在代码中使用while循环,应该在每个序列完成后从run方法返回
更新:
正如OP所指出的,一次“运行”应该基于时间长度,因此您的运行方法应该跟踪它已经运行了多长时间。i、 e.在run方法开始时记录当前时间,然后保持循环直到30秒过去,然后从run方法返回。每次执行都会调用runnablerun()
方法。您不应该在代码中使用while循环,应该在每个序列完成后从run方法返回
更新:
正如OP所指出的,一次“运行”应该基于时间长度,因此您的运行方法应该跟踪它已经运行了多长时间。i、 e.在运行方法开始时记录当前时间,然后继续循环,直到30秒结束,然后从运行方法返回。能否提供有关暂停变量的其他上下文?它到底是如何设置的?@Lefty,它本身不是设置的,它的初始值为false,并以这种方式保留。(没有双关语)您能提供一些关于pause变量的附加上下文吗?它到底是如何设置的?@Lefty,它本身不是设置的,它的初始值为false,并以这种方式保留。(没有双关语)事实上,如果它永远不会返回,它只会被调用一次。@jtahlborn这是一个直接的runnable,run是无效的,因此没有返回。。。。或者我应该将该部分升级为可调用且公正的“return;”@JBNizet,这是我发现自己陷入的陷阱-你会猜到我对并发编程相当陌生-它需要不确定地运行,还是你建议我以后继续调用get?要求它连续运行30秒,然后等待30秒,应用了建议,感谢大家,它对列表进行了一次迭代,然后停止并等待,直到再次调用时,它才再次运行列表…@Beer0-我已经更新了我的答案。希望您现在已经意识到,您可以从一个void方法返回(或者只是让控制转到方法的末尾)。而且,事实上,如果它从未返回,则只调用一次。@jtahlborn这是一个直接可运行的方法,run是void,因此没有返回。。。。或者我应该将该部分升级为可调用且公正的“return;”@JBNizet,这是我发现自己陷入的陷阱-你会猜到我对并发编程相当陌生-它需要不确定地运行,还是你建议我以后继续调用get?要求它连续运行30秒,然后等待30秒,应用了建议,感谢大家,它对列表进行了一次迭代,然后停止并等待,直到再次调用时,它才再次运行列表…@Beer0-我已经更新了我的答案。希望此时您已经意识到,您可以从void方法返回(或者让控制权转到方法的末尾)。