在使用ThreadPoolExecutor管理我的任务而不是为每个任务创建单独的线程之后。我使用以下部分等待特定数量的任务完成:
poolThreadsExecutor.shutdown();
poolThreadsExecutor.awaitTermination(10, TimeUnit.MINUTES);
for (Future<List<String>> future : futures) {
if (!future.isDone()) {
future.cancel(true);
}
}
有了这个代码,我确保在运行的任务完成之前,没有新的任务可以提交。运行任务也有一个超时,之后我检查期货列表并取消任何任务,以防它被阻止。
有了这个解决方案,我就有了我想要的所有要点,但问题是执行器将在之后被销毁,我每次都必须创建一个新的执行器。
有没有可能在不关闭执行器的情况下获得相同的功能?
注:我也不能使用ConditDownLatch,因为任务的数量以前是未知的。
我不知道你是如何提交任务的。但我看到你有一份未来的清单。如果您可以一次提交所有任务,则可以使用:
futures = poolThreadsExecutor.invokeAll(tasks, 10, TimeUnit.MINUTES);
它将执行您的任务,直到所有任务完成或超时过期为止(未完成的任务将被取消)。
另外,来自番石榴的Futures.successfulAsList可能会有所帮助。
这将是一个解决方案的概要:
截止日期=当前TimeMillis()超时
;future.get(time左,MILLISECONDS)
,每次调整time左=截止日期-电流TimeMillis()
;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);
}
}
问题内容: 我不能使用,因为有可能在等待时将新任务添加到ThreadPoolExecutor中。 因此,我正在寻找一种方法,等待ThreadPoolExecutor清空队列并完成所有任务,而又不阻止在此之前添加新任务。 如果有什么不同,这适用于Android。 谢谢 更新 :几周后,我再次进行了修改,发现在这种情况下,修改后的CountDownLatch对我而言效果更好。我会保留答案,因为它更适用
我在ExecutorService中有一些可运行的线程,希望在以下时间后加入线程: 因为它在Runnable中调用自己,所以我不能关闭,因为它可能会阻止自己创建新任务。 如何在不关闭的情况下等待所有线程完成?有没有办法返回一个未来,这样我就可以使用未来::get()。
问题内容: 等待所有任务完成的最简单方法是什么?我的任务主要是计算,所以我只想运行大量的作业-每个内核上一个。现在,我的设置如下所示: 实现可运行。这似乎是正确执行的任务,但代码崩溃上用。这很奇怪,因为我玩了一些玩具示例,而且看起来很奏效。 包含数以万计的元素。我应该使用其他方法吗?我正在寻找尽可能简单的东西 问题答案: 最简单的方法是使用单行代码执行所需的操作。用你的话来说,你需要修改或包装以实
问题内容: 我的问题: 如何在a上执行一堆线程对象并等待它们全部完成后再继续? 我是ThreadPoolExecutor的新手。因此,此代码是测试以了解其工作方式。现在我什至都不用对象填充,因为我不理解如何在不调用另一个队列的情况下开始队列。无论如何,现在我只是打电话给我,但我认为我仍然缺少一些东西。任何提示都很棒!谢谢。 RunnableObject类: 问题答案: 你应该循环
问题内容: 这是我的代码段。 现在做完之后 我要在这里实现的是,我要等待线程池中的所有线程完成执行,然后关闭执行器。 但是我想这不是这里正在发生的事情。主线程似乎正在执行关闭,它只是关闭了所有内容。 在我的线程池大小为2之前,我做了以下事情,而且似乎可行。 我如何在线程池中使用更多线程?谢谢。 问题答案: 您通常使用以下成语: 只是说执行者不会接受新工作。 等待直到所有已提交的任务完成它们的工作(
请给出一个android应用程序的解决方案,用户可以通过点击一个按钮来请求执行一个任务。 *此处任务为非ui活动 null 我正在使用ExcutorService执行任务&ExecutorCompletionService它会抛出错误,因为任务执行程序正在等待其他任务完成,然后如果用户请求其他任务 java.util.concurrent.RejectedExecutionException:任务