如何确保所有生成的线程都已完成,以便继续处理?

时间:2015-04-20 18:23:17

标签: java multithreading data-structures concurrency concurrenthashmap

我有一个ConcurrentMap,我将ArrayList中的元素放到地图上,供其他线程处理。一旦线程完成其处理,它将结果添加到ConcurrentMap并调用方法,以便让我们说“主”线程来获取并处理所有结果(来自ConcurrentMap和{ {1}})。
这种方法有效,但结果是调用方法的次数与列表中元素的数量一样多 问题:我可以使用哪些构造,以便在ArrayList完全填充所有后台线程的结果后调用该方法一次?

2 个答案:

答案 0 :(得分:1)

您可以使用CountDownLatch将其初始化为Arraylist中的总项目,并且每当正在处理的项目使用countDown方法对其进行计数时,

主线程可以在锁存器上调用await方法,等待阻塞线程直到计数器达到零。

答案 1 :(得分:0)

在Java 8中,你可以这样做

ConcurrentMap<Key, Value> map = ...
listToProcess.parallelStream().forEach(e -> addElementToMap(e, map));

这将使用您拥有的所有CPU执行所有元素的处理,并且只有在完成后才返回。