- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我使用 ExecutorService
来执行任务。该任务可以递归地创建提交给同一ExecutorService
的其他任务,这些子任务也可以这样做。
我现在有一个问题,我想等到所有任务都完成(即所有任务都完成并且他们没有提交新任务)后再继续。
我无法在主线程中调用 ExecutorService.shutdown()
,因为这会阻止 ExecutorService
接受新任务。
如果 shutdown
没有被调用,那么调用 ExecutorService.awaitTermination()
似乎什么都不做。
所以我有点卡在这里。 ExecutorService
看到所有工作人员都处于空闲状态并不是那么难,不是吗?我能想到的唯一不优雅的解决方案是直接使用 ThreadPoolExecutor
并每隔一段时间查询它的 getPoolSize()
。真的没有更好的办法吗?
最佳答案
这确实是 Phaser 的理想人选。 Java 7 即将推出这个新类。它是一个灵活的 CountdonwLatch/CyclicBarrier。您可以在 JSR 166 Interest Site 获得稳定版本.
它是更灵活的 CountdownLatch/CyclicBarrier 的方式是因为它不仅能够支持未知数量的参与方(线程),而且还可以重复使用(这就是阶段部分的来源)
对于您提交的每项任务,您都会注册,当该任务完成时,您就会到达。这可以递归完成。
Phaser phaser = new Phaser();
ExecutorService e = //
Runnable recursiveRunnable = new Runnable(){
public void run(){
//do work recursively if you have to
if(shouldBeRecursive){
phaser.register();
e.submit(recursiveRunnable);
}
phaser.arrive();
}
}
public void doWork(){
int phase = phaser.getPhase();
phaser.register();
e.submit(recursiveRunnable);
phaser.awaitAdvance(phase);
}
编辑:感谢@depthofreality 在我之前的示例中指出竞争条件。我正在更新它,以便执行线程仅等待当前阶段的推进,因为它阻塞递归函数完成。
在 arrive
s == register
s 的数量之前,阶段编号不会跳闸。由于在每个递归调用调用 register
之前,当所有调用都完成时会发生阶段增量。
关于Java ExecutorService : awaitTermination of all recursively created tasks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4958330/
我正在尝试实现一个函数,其中可调用对象在规定时间内完成或操作超时。我曾希望 ExecutorService.awaitTermination() 能够执行此操作,但惊讶地发现它没有执行此操作。代码如下
我有一组线程,它们都需要并行执行,并且我必须等待所有线程完成。 我应该使用普通的旧Thread还是ExecutorService?对于 ExecutorService.awaitTermination
我在 Java 中使用线程时遇到问题(我在 Java 中使用线程的经验很少,但在 C++ 中使用很多,所以我了解线程的基本概念)。我已经在 Java 中使用了线程的示例代码,接下来是代码:
我多年来一直存在的问题:在此伪代码中, ExecutorService svc = Executors.newFixedThreadPool(3); svc.submit(new Runnable()
我正在尝试用 Java 编写一个流程,它同时执行一系列任务,等待任务完成,然后将整个流程标记为已完成。每个任务都有自己的信息,包括单个任务何时完成。我正在为流程使用 ExecutorService,并
我用 Executors.newFixedThreadPool(2) 创建了一个固定大小的线程池,并执行了 10 个 Runnable 对象。我设置断点并跟踪执行。但是,即使所有任务都已完成,fixe
我有一个 Spark Structured Streaming 作业,它从 Kafka 主题读取偏移量并将其写入 aerospike 数据库。目前,我正在准备此作业生产并实现 SparkListene
根据 Javadocs,shutdown()将等待所有提交任务执行。我有两个问题: 提交的任务是什么意思?任务是否必须通过 ExecutorService.submit() 方法专门提交,或者也包括通
我使用 ExecutorService 来执行任务。此任务可以递归地创建提交给同一个 ExecutorService 的其他任务,并且这些子任务也可以执行此操作。 我现在遇到的问题是我想等到所有任务都
我必须等待 executorService 中的所有线程完成。我应该使用 while(!executor.isTerminated()){...} or executor.awaitTerminati
需要澄清以下行为。 我有一个带有 java.util.concurrent.ExecutorService 的 java 应用程序,如下所示, for (int i = 0; i < t
在我的代码中,我有许多作为管道运行的 executorservices,因为第一个 executorService 可以将任务提交给任何后续的 executor 服务,但绝不会反过来。 servi
如果我有以下代码,它工作正常: ExecutorService service = Executors.newFixedThreadPool(100); [....] List> futures =
有什么区别 ExecutorService eService = Executors.newFixedThreadPool(2); eService.execute(new TestThread6()
我有一个提交给 ExecutorService 的任务列表。 .但是我需要在凌晨 2:30 的最后期限之前关闭 ExecutorService,即使任务没有完成。我怎样才能做到这一点?我检查了API,
我有两个类。一个 POJO 和 main。 POJO类 public class Processor implements Runnable{ private int id; public Proce
我正在尝试提交多个任务并在可用时获取结果。但是,循环结束后,我必须强制所有任务在指定的时间内完成。如果没有,则抛出错误。最初,我所拥有的只是 executorService 的 invokeAll、s
我是 Java 多线程的新手。我有数以千计的计划任务/线程需要执行。我正在使用以下代码: ScheduledExecutorSerivce scheduleService = Executors.ne
请帮助理解 ExecutorService#awaitTermination(timeout) 行为。 我正在观察我的代码中的情况: private void shutdownAndAwaitTerm
我使用 ExecutorService 来执行任务。该任务可以递归地创建提交给同一ExecutorService的其他任务,这些子任务也可以这样做。 我现在有一个问题,我想等到所有任务都完成(即所有任
我是一名优秀的程序员,十分优秀!