Java future <object> pooling </object>

时间:2014-02-13 18:42:53

标签: java concurrency future

我有一个非常具体的应用程序架构问题。

我需要解析大量的传入目的地,这些对象的分辨率是异步处理的,完成后需要将对象传递到下一阶段。

所以真正的问题归结为,应对大量Future对象的优雅方式是什么。

我应该将它们放入列表中,迭代该列表并在完成后删除它们吗?由于持续的并发访问,列表很可能会被锁定并成为一个巨大的瓶颈。

很抱歉,如果我的问题措辞相当模糊。

4 个答案:

答案 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)

看看RXJava

https://github.com/Netflix/RxJava/wiki

它提供了轻松处理(转换,过滤,组合......)多个异步任务的方法。