我有一个ConcurrentMap
,我将ArrayList
中的元素放到地图上,供其他线程处理。一旦线程完成其处理,它将结果添加到ConcurrentMap
并调用方法,以便让我们说“主”线程来获取并处理所有结果(来自ConcurrentMap
和{ {1}})。
这种方法有效,但结果是调用方法的次数与列表中元素的数量一样多
问题:我可以使用哪些构造,以便在ArrayList
完全填充所有后台线程的结果后调用该方法一次?
答案 0 :(得分:1)
您可以使用CountDownLatch
将其初始化为Arraylist中的总项目,并且每当正在处理的项目使用countDown
方法对其进行计数时,
主线程可以在锁存器上调用await
方法,等待阻塞线程直到计数器达到零。
答案 1 :(得分:0)
在Java 8中,你可以这样做
ConcurrentMap<Key, Value> map = ...
listToProcess.parallelStream().forEach(e -> addElementToMap(e, map));
这将使用您拥有的所有CPU执行所有元素的处理,并且只有在完成后才返回。