条件调度任务

时间:2014-06-02 16:14:48

标签: java timer scheduled-tasks

我需要使用java计时器安排任务,该计时器执行以下操作:

  • 每5分钟发送一次请求(收到状态作为回复)

  • if(status!= end state),然后在接下来的2分钟内每10秒查询一次状态,直到达到结束状态。如果在2分钟结束时没有达到最终状态,请休眠3分钟并重新发送请求。

  • 尝试失败3次后(检查状态为2分钟,间隔10秒),如果未达到最终状态,则恢复为5分钟检查间隔

已经处理了发送请求和查询状态的逻辑。我无法弄清楚以不同的时间间隔安排任务。

我知道run()方法应该记住任务的最后状态,以便它可以适当地重新安排任务。

我对计时器很新。任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

请勿使用Timer使用ScheduledExecutorService。这更加灵活。

首先使用您可能需要的多个线程创建一个实例 - 同时运行任务:

final ScheduledExecutorService service = Executors.newScheduledThreadPool(numThreads);

现在,要安排任务以指定的时间间隔运行,请使用scheduleAtFixedRate方法安排任务。保留指向返回的Future

的指针
final Future<?> handle = service.scheduleAtFixedRate(() -> {}, 0, 5, TimeUnit.MINUTES);

其中() -> {}是空的Runnable的Java 8 lambda。显然你可以在这里传递你想要的任何东西。

现在,你要运行一个小时。只需安排另一个在一小时内运行的任务,并使用handle取消之前的任务:

final Future<?> cancellationHandle = service.schedule(() -> handle.cancel(false), 1, TimeUnit.HOURS);

再次() -> handle.cancel(false)是一个Java 8 lambda,这次调用Runnablehandle.cancel()

老实说,这看起来像一个忙碌的等待模型。我会研究Java的wait()/notify()方法,让Thread等待其他进程完成,并在发生的瞬间被唤醒。