FaN*_*NaJ 6 java collections parallel-processing java-8 java-stream
假设我们有Collection这样的:
Set<Set<Integer>> set = Collections.newSetFromMap(new ConcurrentHashMap<>());
for (int i = 0; i < 10; i++) {
Set<Integer> subSet = Collections.newSetFromMap(new ConcurrentHashMap<>());
subSet.add(1 + (i * 5));
subSet.add(2 + (i * 5));
subSet.add(3 + (i * 5));
subSet.add(4 + (i * 5));
subSet.add(5 + (i * 5));
set.add(subSet);
}
Run Code Online (Sandbox Code Playgroud)
并处理它:
set.stream().forEach(subSet -> subSet.stream().forEach(System.out::println));
Run Code Online (Sandbox Code Playgroud)
要么
set.parallelStream().forEach(subSet -> subSet.stream().forEach(System.out::println));
Run Code Online (Sandbox Code Playgroud)
要么
set.stream().forEach(subSet -> subSet.parallelStream().forEach(System.out::println));
Run Code Online (Sandbox Code Playgroud)
要么
set.parallelStream().forEach(subSet -> subSet.parallelStream().forEach(System.out::println));
Run Code Online (Sandbox Code Playgroud)
所以,有人可以解释我:
他们之间有什么区别?
可以把它想象成两个嵌套循环.
第四种情况并不清楚,因为实际上只有一个线程池,如果池忙,则可以使用当前线程,即它可能根本不是并行^ 2.
哪一个更好?快点?更安全?
第一个,但使用平面地图将再次更简单.
set.stream().flatMap(s -> s.stream()).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
其他版本更复杂,因为作为瓶颈的控制台是共享资源,多线程版本可能会更慢.
哪一个适合大量收藏?
假设您的目标是执行除打印之外的其他操作,您希望有足够的任务来保持所有CPU忙碌,但不会产生很多任务.第二种选择可能值得考虑.
当我们想对每个项目应用繁重的流程时,哪一个是好的?
同样,第二个例子可能是最好的,如果你有少量的外部集合,可能是第三个例子.
| 归档时间: |
|
| 查看次数: |
822 次 |
| 最近记录: |