0

我需要一些可以启动的例程 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

所以基本上我需要任务 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 完成,我不知道该怎么做。

4

2 回答 2

1

我建议你把问题简单得多。

  • 有一个每 5 秒开始的重复任务。
  • 首先要做的是检查一个 volatile 标志,如果设置了,则不做任何事情就返回。

要打开此过程,请取消设置标志。要暂停它,请设置标志。

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

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

于 2013-09-01T18:38:08.113 回答
1

ScheduledExecutorService 可以使用 shutdown 和 awaitTermination 方法停止。可以在此处找到有关与 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 方法。)

于 2013-09-01T19:22:29.860 回答