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

执行器服务在没有等待任务完成的情况下被终止

谭思博
2023-03-14

我的遗嘱执行人服务是这样的:

ExecutorService exec = Executors.newFixedThreadPool(4);
for(int i=0; i<4;i++) {
  Consumer consumer = new Consumer();
  exec.execute(new ConsumerstartUpThread(consumer));
}

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

共有1个答案

双子民
2023-03-14

试试看

ExecutorService exec = Executors.newFixedThreadPool(4);
List<Callable<Object>> tasks = new ArrayList<Callable<Object>>();
for (int i = 0; i < 4; i++) {
    tasks.add(Executors.callable(new ConsumerstartUpThread(new Consumer())));
}
exec.invokeAll(tasks);
exec.shutdown();

invokeAll将等待所有任务终止(参见API)。为了更简单,让ConsumerstartUpThread实现Callable而不是Runnable

 类似资料:
  • 问题内容: 我不能使用,因为有可能在等待时将新任务添加到ThreadPoolExecutor中。 因此,我正在寻找一种方法,等待ThreadPoolExecutor清空队列并完成所有任务,而又不阻止在此之前添加新任务。 如果有什么不同,这适用于Android。 谢谢 更新 :几周后,我再次进行了修改,发现在这种情况下,修改后的CountDownLatch对我而言效果更好。我会保留答案,因为它更适用

  • 我正在运行的服务器应用程序获取我要使用任务系统处理的多个任务请求。 每个任务都表示为一个可运行的线程池,该线程池中的线程数小于或等于线程池的大小,需要线程池中的线程数。当然,线程池是必要的,以避免CPU因线程过多而过载。 然而,其中一些任务可以是多线程的,而另一些则不能。这就是为什么一个任务可能需要等待其所有特定线程完成,以便合并这些线程的结果以获得最终结果的原因。 如果使用多个实例,则可以像这样

  • 我在spring中有一个服务,它需要使用十种不同的方法获取数据。 我希望这些方法并行执行,以执行一些DB操作并返回到父线程。但是父线程应该等到所有响应出现,然后返回响应。 在我当前的方法中,我使用反应式mono异步执行所有方法,但主线程不等待订阅者方法完成。 下面是我订阅的两种方法 下面是我的主要方法 以下是我的输出: 我的输出显示,主线程没有等待订阅服务器完成其任务,因此我如何处理这种情况?

  • 问题内容: 如何让我的代码等待,直到DispatchQueue中的任务完成?是否需要任何CompletionHandler或其他东西? 我正在使用Xcode 8.2并在Swift 3中编写。 问题答案: 使用s可以实现这一点。您可以在群组和通话达到平衡时得到通知: 或者您可以等待: 注意 :阻止当前队列(在您的情况下可能是主队列),因此您必须在另一个队列上(如上面的示例代码中)以避免 死锁 。

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

  • 我有一个Spring boot项目,它有使用kafka进行日志记录的依赖项。我无法摆脱所述依赖项,因为我的逻辑需要来自该依赖项的代码 我已尝试禁用自动配置 我尝试通过bean配置将missingTopicsFatal设置为false 但很明显,设置已经是假的,因为我的应用程序运行时没有失败,只是tomcat不想打开侦听端口 应用程序启动,但spring拒绝打开侦听端口,并继续使用错误进行循环 在本