我有一个后台任务,我使用ScheduledThreadPoolExecutor运行,代码如下。
executor.scheduleWithFixedDelay(new BackgroundSync(), 0, 15, TimeUnit.MINUTES);
BackgroundSync实现了Runnable。
有时从用户事件中我希望延迟事件现在运行而不是15分钟计时器关闭时。
一些要求:
答案 0 :(得分:2)
scheduleWithFixedDelay返回ScheduledFuture。调用它时,将其存储在某个位置,如果要立即执行,请检查它是否存在。然后,您可以使用cancel方法取消预定的未来,并再次安排runnable立即执行。
答案 1 :(得分:2)
Kabuko的解决方案可能和你一样好,但有一个障碍。
如果任务在开始之前被取消,则cancel()
方法返回true
,如果任务已经运行,则false
返回cancel()
。问题是如果任务当前正在运行,true
将返回{{1}}。因此,您需要实现一些其他机制来决定是否重新提交任务。