检查定期 ScheduledFuture 是否正在运行

问题描述 投票:0回答:3

我通过 Spring 安排了一项定期任务

TaskScheduler.schedule(Runnable, Trigger)

鉴于返回的

ScheduledFuture
,有没有办法检查任务当前是否正在运行?

java concurrency scheduling
3个回答
8
投票

经过一番测试,

public static boolean isRunning(ScheduledFuture future) {
    return future.getDelay(TimeUnit.MILLISECONDS) <= 0;
}

就像一个魅力。似乎任务只有在完成后才会重新安排,因此

getDelay()
返回负值。


2
投票

你可以像这样改变你的Runnable:

class Runner implements Runnable{
    public volatile boolean RUNNING = false;
        public void run(){

        RUNNING = true;
        try{
            // Your code
        } finally {
            RUNNING = false;
        }
    }
}

编辑 认为带有

boolean
的操作是原子的,不需要是易失性的。


0
投票

如果您需要检查非周期性未来(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]")

虽然有点丑,但是很管用

© www.soinside.com 2019 - 2024. All rights reserved.