![](/img/trans.png)
[英]How to wait for all tasks in an ThreadPoolExecutor to finish without shutting down the Executor?
[英]How to wait for all tasks within a ThreadPoolExecutor to finish within a timeout and without shutting the Executor down?
使用ThreadPoolExecutor管理我的任务,而不是为每个单独的线程创建。 我使用以下部分等待特定数量的任务完成:
poolThreadsExecutor.shutdown();
poolThreadsExecutor.awaitTermination(10, TimeUnit.MINUTES);
for (Future<List<String>> future : futures) {
if (!future.isDone()) {
future.cancel(true);
}
}
使用此代码,我确保在运行完成之前不能提交任何新任务。 运行任务也有超时,之后我检查期货清单并取消任何任务,以防它被阻止。
有了这个解决方案,我得到了我想要的所有要点,但问题是执行者之后会被销毁,我每次都要创建一个新的。
是否有可能在不关闭执行程序的情况下获得相同的功能?
PS:我也不能使用CoundDownLatch,因为以前不知道任务的数量。
这将是一个解决方案的概述:
deadline = currentTimeMillis() + timeout
; future.get(timeLeft, MILLISECONDS)
,每次调整timeLeft = deadline - currentTimeMillis()
; final long deadline = System.currentTimeMillis() + timeout;
for (Future<?> f : futures) {
final long timeLeft = deadline - System.currentTimeMillis();
if (timeLeft <= 0) break;
try {
f.get(timeLeft, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
break;
}
}
for (Future<?> f : futures) {
if (!future.isDone()) {
future.cancel(true);
}
}
我不知道你是如何提交任务的。 但我看到你有一份期货清单。 如果您可以立即提交所有任务,您可以使用:
futures = poolThreadsExecutor.invokeAll(tasks, 10, TimeUnit.MINUTES);
它将执行您的任务,阻塞直到所有完成或超时到期(未完成的任务被取消)。
来自番石榴的Futures.successfulAsList也许会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.