来自哈希集的并行流不并行运行
我有一些要并行处理的元素的集合。当我使用时,并行性有效。但是,当我使用时,它不会并行运行。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