我有一个非常具体的应用程序架构问题。
我需要解析大量的传入目的地,这些对象的分辨率是异步处理的,完成后需要将对象传递到下一阶段。
所以真正的问题归结为,应对大量Future对象的优雅方式是什么。
我应该将它们放入列表中,迭代该列表并在完成后删除它们吗?由于持续的并发访问,列表很可能会被锁定并成为一个巨大的瓶颈。
很抱歉,如果我的问题措辞相当模糊。
答案 0 :(得分:2)
如果您在任务完成后需要完成某些工作,我会将该工作添加到任务中。即,不添加任务,而是添加一个Runnable,它执行任务以及您需要对结果执行的操作。这样,结果的处理是及时和并发的。
答案 1 :(得分:2)
来自Java8的CompletableFuture具有组织任务链的方法。特别是,
allOf(CompletableFuture<?>... cfs)
Returns a new CompletableFuture that is completed when all of the
given CompletableFutures complete.
因此,收集数组cfs
中第一阶段的所有CompletableFuture,然后调用
CompletableFuture.allOf(cfs).thenRunAsync(nextPhase)
答案 2 :(得分:1)
看一下这篇文章:https://stackoverflow.com/a/24363156/1248724
由于您希望等待所有任务完成,直到您可以使用他们的结果进行下一阶段,您正在寻找CountDownLatch
。
这是一个使用ExecutorService的示例:
CountDownLatch latch = new CountDownLatch(totalNumberOfTasks);
ExecutorService taskExecutor = Executors.newFixedThreadPool(4);
while(...) {
taskExecutor.execute(new MyTask());
}
try {
latch.await();
} catch (InterruptedException E) {
// handle
}
并在你的任务中(包含在try / finally中)
latch.countDown();
答案 3 :(得分:0)