如何启动、暂停、继续每 5 秒执行一次的任务作为"keep busy"任务



我需要一些可以启动的例程R,它每5秒执行一次任务T。

然后我需要暂停这个重复例程R,但要确保一旦它开始了一个任务T,这个任务就完成了,只有在重复例程停止开始下一个任务之后。每个启动的任务都应该被允许完成!任务本身最多需要2秒,因此重复中没有重叠!

此外,我需要确保另一个例程R2仅在任务T完成之后才开始。

所以基本上它应该是这样的:

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

因此,基本上,当用户阅读文本时,我需要带有任务T的例程R作为某种"保持忙碌的例程"。

当用户完成阅读并想通过按下按钮继续时,"保持忙碌程序"应停止,并仅在用户的预定任务完成后再次继续,该任务由按下按钮触发

所以我找到

 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);

但是所有的停止,继续,以及在R2继续之前等待T结束,我不知道该怎么做。

我建议您简化这个问题。

  • 有一个每隔5秒开始的重复任务
  • 首先要做的是检查volatile标志,如果设置了该标志,则返回而不执行任何操作

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

你的任务可以做不止一件事。如果它需要在T完成后执行R2,您可以检查并在同一任务中执行它。没有必要创建另一个这样的任务。

注意:如果您将R2添加到与T相同的ExecutorService,它必须等待它完成后才能启动R2。这个单线程服务一次只能做一件事。

ScheduledExecutitorService可以使用shutdown和awaitTermination方法停止。有关要与ScheduledExecutiorService一起使用的方法的信息,可以在此处找到: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

关闭似乎会阻止执行器添加和接受新任务。awaitTermination方法允许您等待最后一个任务的执行结束。

这应该允许您停止执行器并向其添加不同的任务。(避免shutdownNow方法。)

最新更新