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

如何等待ThreadPoolExecutor中的所有任务在超时时间内完成,而不关闭执行器?

公孙宏畅
2023-03-14

在使用ThreadPoolExecutor管理我的任务而不是为每个任务创建单独的线程之后。我使用以下部分等待特定数量的任务完成:

poolThreadsExecutor.shutdown();
poolThreadsExecutor.awaitTermination(10, TimeUnit.MINUTES);
for (Future<List<String>> future : futures) {
    if (!future.isDone()) {
       future.cancel(true);
    }
}

有了这个代码,我确保在运行的任务完成之前,没有新的任务可以提交。运行任务也有一个超时,之后我检查期货列表并取消任何任务,以防它被阻止。

有了这个解决方案,我就有了我想要的所有要点,但问题是执行器将在之后被销毁,我每次都必须创建一个新的执行器。

有没有可能在不关闭执行器的情况下获得相同的功能

注:我也不能使用ConditDownLatch,因为任务的数量以前是未知的。

共有2个答案

孟乐
2023-03-14

我不知道你是如何提交任务的。但我看到你有一份未来的清单。如果您可以一次提交所有任务,则可以使用:

futures = poolThreadsExecutor.invokeAll(tasks, 10, TimeUnit.MINUTES);

它将执行您的任务,直到所有任务完成或超时过期为止(未完成的任务将被取消)。

另外,来自番石榴的Futures.successfulAsList可能会有所帮助。

常献
2023-03-14

这将是一个解决方案的概要:

  1. 计算任务完成的截止日期:截止日期=当前TimeMillis()超时
  2. 循环遍历所有的期货,调用future.get(time左,MILLISECONDS),每次调整time左=截止日期-电流TimeMillis()
  3. 如果到了最后期限,那么跳出这个循环,进入取消循环。
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:任务