我通过 Spring 安排了一项定期任务
TaskScheduler.schedule(Runnable, Trigger)
。
鉴于返回的
ScheduledFuture
,有没有办法检查任务当前是否正在运行?
经过一番测试,
public static boolean isRunning(ScheduledFuture future) {
return future.getDelay(TimeUnit.MILLISECONDS) <= 0;
}
就像一个魅力。似乎任务只有在完成后才会重新安排,因此
getDelay()
返回负值。
你可以像这样改变你的Runnable:
class Runner implements Runnable{
public volatile boolean RUNNING = false;
public void run(){
RUNNING = true;
try{
// Your code
} finally {
RUNNING = false;
}
}
}
编辑 认为带有
boolean
的操作是原子的,不需要是易失性的。
如果您需要检查非周期性未来(java.util.concurrent.FutureTask),则仅使用
的解决方案future.getDelay(TimeUnit.MILLISECONDS) <= 0
不起作用。连组合都无法
future.getDelay(TimeUnit.MILLISECONDS) <= 0 && !future.isDone()
因为
future.isDone()
对于除 NEW 之外的所有状态都返回 true,NEW 表示“已计划”。但如果未来刚刚开始future.getDelay(TimeUnit.MILLISECONDS) <= 0 && !future.isDone()
永远不会返回true,因为未开始的未来(新)永远不会有负延迟
所以我想出了一个非常愚蠢的简单解决方案并且它有效
!future.isDone() && future.toString().startsWith("[Not completed]")
虽然有点丑,但是很管用