我需要使用java计时器安排任务,该计时器执行以下操作:
每5分钟发送一次请求(收到状态作为回复)
if(status!= end state),然后在接下来的2分钟内每10秒查询一次状态,直到达到结束状态。如果在2分钟结束时没有达到最终状态,请休眠3分钟并重新发送请求。
尝试失败3次后(检查状态为2分钟,间隔10秒),如果未达到最终状态,则恢复为5分钟检查间隔
已经处理了发送请求和查询状态的逻辑。我无法弄清楚以不同的时间间隔安排任务。
我知道run()方法应该记住任务的最后状态,以便它可以适当地重新安排任务。
我对计时器很新。任何帮助都会非常感激。
答案 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,这次调用Runnable
是handle.cancel()
。
老实说,这看起来像一个忙碌的等待模型。我会研究Java的wait()/notify()
方法,让Thread
等待其他进程完成,并在发生的瞬间被唤醒。