如何等待 ThreadPoolExecutor 中的所有任务完成而不关闭执行程序?

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

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

如果它有任何区别,这是针对Android的。

谢谢

更新:在重新审视这个问题后,许多周后,我发现在这种情况下,修改后的CountDownLatch对我更有效。我会标记答案,因为它更适用于我提出的问题。


答案 1

如果您有兴趣了解某个任务或某批任务何时完成,则可以使用 。调用此方法将返回一个对象,该对象可能被放入一个对象中,然后您的主线程将迭代调用每个对象。这将导致主线程暂停执行,直到 处理完所有任务。ExecutorService.submit(Runnable)FutureCollectionFuture.get()ExecutorServiceRunnable

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

答案 2

我的方案是一个 Web 爬网程序,用于从网站获取一些信息,然后对其进行处理。ThreadPoolExecutor用于加快该过程,因为可以在一段时间内加载许多页面。因此,将在现有任务中创建新任务,因为爬网程序将跟踪每个页面中的超链接。问题是一样的:主线程不知道所有任务何时完成,它可以开始处理结果。我用一个简单的方法来确定这一点。它不是很优雅,但在我的情况下有效:

while (executor.getTaskCount()!=executor.getCompletedTaskCount()){
    System.err.println("count="+executor.getTaskCount()+","+executor.getCompletedTaskCount());
    Thread.sleep(5000);
}
executor.shutdown();
executor.awaitTermination(60, TimeUnit.SECONDS);

推荐