如何启动,暂停,继续每5秒执行一次作为“保持忙”任务的任务

时间:2013-09-01 18:32:16

标签: java scheduled-tasks

我需要一些常规的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继续之前完成我不知道该怎么做。

2 个答案:

答案 0 :(得分:1)

我建议你让问题更简单。

  • 有一个重复的任务,开始时间为5秒。
  • 第一件事就是检查一个易失性标志,如果设置,则返回时不做任何事情。

要启用此过程,请取消设置标记。要暂停它,请设置标志。

你的任务可以做多件事。如果在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方法。)