我需要一些常规的R,我可以开始,每隔5秒执行一次任务T.
然后我需要暂停这个重复的例程R - 但确保一旦它启动任务T,这个任务就完成了,然后只有重复的例程停止开始下一个任务。应该允许每个启动任务完成! 任务本身最多需要2秒,因此重复没有重叠!
此外,我还需要确保在任务T完成后才启动另一个例程R2。
所以基本上它应该是这样的:
start R
- R starts T the first time
- T runs and finishes, this task T takes maximum 2 seconds
- T starts again after 5 seconds it started the first time
now stop R (because user pressed a button)
- let T finish
- stop R from starting a new Task
continue with R2 (basically the task from which the button has been pressed)
BUT continue with R2 ONLY AFTER T has finished for sure! - and R will not repeat any new T
once R2 is done continue with R
- so R will start a new task T
所以基本上我需要例程R和任务T作为某种“保持忙碌的例程”,而用户例如读取文本。
当用户完成阅读并希望通过按下按钮继续时,“保持忙碌程序”应该停止并且仅在用户的预期任务完成后再次继续,这是由按钮按下的第一个位置触发的< / p>
所以我找到了
private final static ScheduledExecutorService scheduler = Executors
.newScheduledThreadPool(1);
// Schedule a task to run every 5 seconds with no initial delay.
scheduler.scheduleAtFixedRate(new Runnable() {
public void run() {
..do task T
}
}, 0L, 5L, TimeUnit.SECONDS);
但是所有停止,继续和等待T在R2继续之前完成我不知道该怎么做。
答案 0 :(得分:1)
我建议你让问题更简单。
要启用此过程,请取消设置标记。要暂停它,请设置标志。
你的任务可以做多件事。如果在T完成后需要执行R2,则可以检查并在同一任务中执行它。没有必要创建另一个任务。
注意:如果将R2添加到与T相同的ExecutorService中,则必须等待它完成才能启动R2。这种单线程服务一次只能做一件事。
答案 1 :(得分:1)
可以使用shutdown和awaitTermination方法停止ScheduledExecutorService。 有关与ScheduledExecutorService一起使用的方法的信息,请访问: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html
有关关闭和等待终止方法的更多信息,请访问: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html
Shutdown似乎阻止执行者添加,接受新任务。 awaitTermination方法允许您等待上一个任务的执行结束。
这应该让你停止执行程序并向其添加不同的任务。 (避免使用shutdownNow方法。)