【发布时间】:2015-05-13 04:31:38
【问题描述】:
我有一些想要并行处理的元素。当我使用List 时,并行性有效。但是,当我使用Set 时,它不会并行运行。
我写了一个代码示例来说明问题:
public static void main(String[] args) {
ParallelTest test = new ParallelTest();
List<Integer> list = Arrays.asList(1,2);
Set<Integer> set = new HashSet<>(list);
ForkJoinPool forkJoinPool = new ForkJoinPool(4);
System.out.println("set print");
try {
forkJoinPool.submit(() ->
set.parallelStream().forEach(test::print)
).get();
} catch (Exception e) {
return;
}
System.out.println("\n\nlist print");
try {
forkJoinPool.submit(() ->
list.parallelStream().forEach(test::print)
).get();
} catch (Exception e) {
return;
}
}
private void print(int i){
System.out.println("start: " + i);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
}
System.out.println("end: " + i);
}
这是我在 Windows 7 上得到的输出
set print
start: 1
end: 1
start: 2
end: 2
list print
start: 2
start: 1
end: 1
end: 2
我们可以看到Set 中的第一个元素必须在处理第二个元素之前完成。对于List,第二个元素在第一个元素结束之前开始。
你能告诉我是什么导致了这个问题,以及如何使用Set 集合来避免它吗?
【问题讨论】:
-
尝试使用两个以上的元素,例如 10. 个元素或其他东西。 2 的结果太模糊了
-
当您尝试使用 10 时,您仍然无法并行所有集合元素。而且我需要并行运行所有元素。
-
无论如何,这是 10 个(有 10 个执行器池)元素的输出设置打印开始:8 开始:0 开始:4 开始:6 开始:2 结束:2 结束:6 结束:4结束:0 开始:1 结束:8 开始:9 开始:5 开始:7 开始:3 结束:3 结束:5 结束:9 结束:7 结束:1 列表打印开始:7 开始:3 开始:0 开始:6开始:9 开始:8 开始:5 开始:4 开始:2 开始:1 结束:0 结束:6 结束:7 结束:9 结束:2 结束:3 结束:8 结束:5 结束:1 结束:4 不是全部设置元素并行运行
标签: java lambda parallel-processing java-8 java-stream