Java ScheduledExecutorService-检查计划任务是否已完成

Java ScheduledExecutorService-检查计划任务是否已完成,java,multithreading,timer,singleton,Java,Multithreading,Timer,Singleton,我有一个服务器端应用程序,客户端可以请求重新加载配置。如果客户端请求重新加载配置,则不应立即执行此操作,而应延迟1分钟。如果另一个客户端也在同一分钟内请求重新加载配置,则应忽略此请求 我的想法是使用ScheduledExecutorService来安排任务,如: ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); service.schedule(new LoadConfigurat

我有一个服务器端应用程序,客户端可以请求重新加载配置。如果客户端请求重新加载配置,则不应立即执行此操作,而应延迟1分钟。如果另一个客户端也在同一分钟内请求重新加载配置,则应忽略此请求

我的想法是使用ScheduledExecutorService来安排任务,如:

 ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
 service.schedule(new LoadConfigurationTask(), 1, TimeUnit.MINUTES);

 public class LoadConfigurationTask Runnable {
    public void run() {
      // LoadConfiguration
    }
 }

如何检查LoadConfigurationTask是否已计划但尚未执行,以便在重新加载配置之前能够忽略进一步的请求?

最简单的方法就是设置一个
AtomicBoolean

启动任务时将其设置为true,任务完成时将其设置为false,除非启用false,否则不要再启动


确保在finally块中将设置为false,以便在不取消设置的情况下不会意外退出。

您只需获得对ScheduledFuture的引用,如下所示:

ScheduledFuture ScheduledFuture=service.schedule(new-LoadConfigurationTask(),1,TimeUnit.MINUTES);
现在,对于未来,您可以检查任务是否完成:

schedFuture.isDone();
或者更好的方法是,检查在开始执行之前还有多少时间:

schedFuture.getDelay(时间单位:分钟);

不需要外部变量来跟踪状态。

如果正在运行重新加载配置任务,该怎么办?是否还应忽略另一个请求?如果任务在1毫秒前完成该怎么办?否如果任务正在运行,则应安排新任务注意这可能不会准确返回您想要的结果。例如,我创建了一个运行1分钟的任务。在前10秒内调用了
future.cancel()
。对于
isDone()和isCancel()
,future将返回
true
,但是任务将继续运行,直到完成1分钟。@user3758745您已经指出了一个重要的问题,这与Java处理线程的方式有关。一旦工作开始,几乎没有办法从JVM内部阻止它。Call future.cancel(true)将发送一个中断信号,但前提是线程被编码为正确处理中断信号。如果您使用ScheduledFuture.cancel(false)取消一项任务,并且该任务是长期运行的,那么ScheduledFuture.isDone()将为true,但实际上该任务将继续运行,请随时检查答案。也许最好的方法是“Tim B”引用的方法。