【发布时间】:2018-06-21 13:46:40
【问题描述】:
所以我有一个列表,我可以从中获取并行流来填写地图,如下所示:
Map<Integer, TreeNode> map = new HashMap<>();
List<NodeData> list = some_filled_list;
//Putting data from the list into the map
list.parallelStream().forEach(d -> {
TreeNode node = new TreeNode(d);
map.put(node.getId(), node);
});
//print out map
map.entrySet().stream().forEach(entry -> {
System.out.println("Processing node with ID = " + entry.getValue().getId());
});
这段代码的问题是,当“放置数据”过程仍在进行时,地图正在被打印出来(因为它是并行的),因此,地图还没有从列表中接收到所有元素.当然,在我的真实代码中,它不仅仅是打印出地图;我使用地图来利用 O(1) 查找时间。
我的问题是:
如何让主线程等待,以便“放数据”在地图打印出来之前完成?我试图将“放置数据”放在线程 t 中,然后执行
t.start()和t.join(),但这没有帮助。也许在这种情况下我不应该使用并行流?清单很长,我只是想利用并行性来提高效率。
【问题讨论】:
-
通过其构造函数
new TreeNode(d)创建TreeNode实例的计算成本是否很高?我的意思是如果它有沉重的CPU负载。如果答案是否定的,那么使用并行流将一无所获。并行流仅对执行非常昂贵的 CPU 绑定任务的极少数应用程序有用。并行流不适用于只需要并发的场景(例如调用远程服务而不依次等待每个服务的结果)。
标签: java multithreading collections parallel-processing java-stream