当前位置: 首页 > 知识库问答 >
问题:

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

步炯
2023-03-14

我有一个服务器端应用程序,客户端可以请求重新加载配置。如果一个客户端请求重新加载配置,这不应该立即完成,而是延迟1分钟。如果另一个客户端也在同一分钟内请求重新加载配置,这个请求应该被忽略。

我的想法是安排一个任务与调度ExecutorService像:

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

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

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

共有2个答案

岳枫
2023-03-14

最简单的方法就是设置一个原子布尔http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicBoolean.html

启动任务时将其设置为true,任务完成时将其设置为false,除非它处于false状态,否则不要再启动。

确保你在最终块中设置为false,这样你就不会在不取消设置的情况下意外退出。

酆出野
2023-03-14

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

ScheduledFuture<?> schedFuture = service.schedule(new LoadConfigurationTask(), 1, TimeUnit.MINUTES);

现在,对于未来,您可以检查任务是否完成:

schedFuture.isDone();

或者更好的办法是,检查在开始执行之前还有多少时间:

schedFuture.getDelay(TimeUnit.MINUTES);

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

 类似资料:
  • 我在Windows Server 2012的任务计划程序中有几个计划任务。我正在通过PowerShell运行这些任务 我正在寻找一种检查任务何时完成的方法。我认为我可以在<code>中检查任务的状态,$tasks 我本以为这段代码会导致< code>Ready,然后是< code>Running,但它最终打印出< code>Ready,< code>Ready。 我还注意到,当任务正在执行时,任务

  • 我们在spring boot应用程序中实现了一个计划任务,用于从MQ读取消息。在IntelliJ中调试时,我看到任务的线程被启动,然后在任务完成后进入等待状态。 这是正常的还是应该在任务完成后停止/销毁线程?此外,我们必须手动执行还是Spring会处理它(任务代码中的某些内容正在阻止它)

  • 问题内容: 我在Java文档中看到了这一点:ScheduledAtFixedRate,它说 如果该任务的任何执行遇到异常,将禁止后续执行 我不希望在我的应用程序中发生这种情况。即使看到异常,我也总是希望后续执行继续进行。我怎样才能从。 问题答案: 用try / catch包围Callable.call方法或Runnable.run方法… 例如: 请注意,捕获除编译器也告诉您的内容之外的其他内容(在

  • 问题内容: 我有ConcurrentLinkedDeque,它用于同步push / pop元素,还有一些异步任务,这些任务正在从堆栈中获取一个元素,如果该元素具有邻居,则会将其推入堆栈。 示例代码: 我想在while循环中有另外一条语句来回答问题-“执行程序中的任何任务都在工作?” 问题答案: 如果使用,没有一种干净的方法来检查所有Runnable是否都已完成。除非您在Runnable本身中构建了

  • 问题内容: 我正在使用线程和队列模块在Python中编写一个简单的搜寻器。我获取一个页面,检查链接并将它们放入队列中,当某个线程完成页面处理后,它将从队列中获取下一个页面。我对已经访问过的页面使用数组,以过滤添加到队列的链接,但是如果有多个线程并且它们在不同页面上获得相同的链接,则会将重复的链接放入队列。那么,如何确定队列中是否已经有一些url以避免再次放置? 问题答案: 如果您不关心项目的处理顺

  • 我相信字段选择器可能有一个bug,但只是想知道是否有任何修复或解决方案的细节。