当前位置: 首页 > 面试题库 >

如何在不关闭执行器的情况下等待ThreadPoolExecutor中的所有任务完成?

赫连飞沉
2023-03-14
问题内容

我不能使用shutdown()awaitTermination()因为有可能在等待时将新任务添加到ThreadPoolExecutor中。

因此,我正在寻找一种方法,等待ThreadPoolExecutor清空队列并完成所有任务,而又不阻止在此之前添加新任务。

如果有什么不同,这适用于Android。

谢谢

更新 :几周后,我再次进行了修改,发现在这种情况下,修改后的CountDownLatch对我而言效果更好。我会保留答案,因为它更适用于我的要求。


问题答案:

如果您想知道何时完成某项任务或某批任务,可以使用ExecutorService.submit(Runnable)。调用此方法将返回一个Future对象,该对象可以放置在Collection其中,然后您的主线程将在调用Future.get()每个对象时进行迭代。这将导致您的主线程停止执行,直到ExecutorService已处理完所有Runnable任务。

Collection<Future<?>> futures = new LinkedList<Future<?>>();
futures.add(executorService.submit(myRunnable));
for (Future<?> future:futures) {
    future.get();
}


 类似资料:
  • 在使用ThreadPoolExecutor管理我的任务而不是为每个任务创建单独的线程之后。我使用以下部分等待特定数量的任务完成: 有了这个代码,我确保在运行的任务完成之前,没有新的任务可以提交。运行任务也有一个超时,之后我检查期货列表并取消任何任务,以防它被阻止。 有了这个解决方案,我就有了我想要的所有要点,但问题是执行器将在之后被销毁,我每次都必须创建一个新的执行器。 有没有可能在不关闭执行器的

  • 我的遗嘱执行人服务是这样的: 实现了runnable,它的run方法具有巨大的功能,需要调用其他几个API。现在,当我在调试模式下运行代码时,任务就完成了。当我正常运行时,任务是不完整的,线程被终止。线程不是要等到所有任务都完成了吗?为什么他们没有完成任务就被解雇了?

  • 问题内容: 该代码选择同一文件夹中的所有xml文件,作为被调用的可执行文件,并以异步方式将处​​理应用于回调方法中的每个结果(在下面的示例中,仅打印文件名)。 如何避免使用sleep方法阻止main方法退出?我在解决问题时遇到了麻烦(我想这就是同步结果所必需的),因此,我们将不胜感激! 问题答案: 您可以使用sync.WaitGroup。引用链接的示例:

  • 问题内容: 这是我的代码段。 现在做完之后 我要在这里实现的是,我要等待线程池中的所有线程完成执行,然后关闭执行器。 但是我想这不是这里正在发生的事情。主线程似乎正在执行关闭,它只是关闭了所有内容。 在我的线程池大小为2之前,我做了以下事情,而且似乎可行。 我如何在线程池中使用更多线程?谢谢。 问题答案: 您通常使用以下成语: 只是说执行者不会接受新工作。 等待直到所有已提交的任务完成它们的工作(

  • Spring引导在没有完成所有任务的情况下关闭。 MainApplication.java java datacollector.java

  • 问题内容: 等待所有任务完成的最简单方法是什么?我的任务主要是计算,所以我只想运行大量的作业-每个内核上一个。现在,我的设置如下所示: 实现可运行。这似乎是正确执行的任务,但代码崩溃上用。这很奇怪,因为我玩了一些玩具示例,而且看起来很奏效。 包含数以万计的元素。我应该使用其他方法吗?我正在寻找尽可能简单的东西 问题答案: 最简单的方法是使用单行代码执行所需的操作。用你的话来说,你需要修改或包装以实