2013-09-01 29 views
0

我需要有一些例程R,我可以启动它并每5秒执行一次任务T.如何开始,暂停,继续每5秒钟执行一次任务作为“保持繁忙”任务

然后我需要暂停这个重复例程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); 

但是,所有的停止,继续并等待对于T完成R2继续,我不知道该怎么办propperly之前。

回答

1

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

  • 有一个重复的任务,开始5秒。
  • 首先要做的是检查一个易失标志,如果设置了,则不做任何回应。

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

你的任务可以做更多的事情。如果T完成后需要执行R2,则可以检查并在同一任务中执行。没有必要像这样创建另一个任务。

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

+0

完美:-)谢谢 – user387184

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

关机似乎从添加停止执行,接受新的任务。 awaitTermination方法让你等待最后一个任务的执行结束。

这应该让您停止执行程序并向其添加不同的任务。 (避免使用shutdownNow方法。)