在java中调度可运行的任务

时间:2010-01-23 22:19:39

标签: java timer scheduling timer-jobs

关于使用ScheduledThreadPoolExecutor执行某些重复任务,我正在跟进一个有趣的question

调度此对象将返回ScheduledFuture对象,可以使用该对象取消下一次任务运行。

这里需要注意的一点是任务本身与时间表完全分离 -

ScheduledExecutorService executor = new ScheduledThreadPoolExecutor(1);
ScheduledFuture nextSchedule = 
    executor.schedule(task, 60000, TimeUnit.MILLISECONDS);

其中 -

SomeTask task = new SomeTask();

因此任务本身并不了解时间表。如果有办法让任务取消并为自己创建一个新的时间表,请启发。

谢谢

2 个答案:

答案 0 :(得分:7)

没有理由为什么该任务无法引用ScheduledExecutorService并安排自己在需要时再次运行:

// (Need to make variable final *if* it is a local (method) variable.)
final ScheduledExecutorService execService = Executors.newSingleThreadScheduledExecutor();

// Create re-usable Callable.  In cases where the Callable has state
// we may need to create a new instance each time depending on requirements.
Callable<Void> task = new Callable() {
  public Void call() {
    try {
      doSomeProcessing();
    } finally {
      // Schedule same task to run again (even if processing fails).
      execService.schedule(this, 1, TimeUnit.SECONDS);
    }
  }
}

答案 1 :(得分:4)

executor传递给任务,以便它可以使用它进行操作:

SomeTask task = new SomeTask(executor);