我有一组元素,想要并行处理。当我使用 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
集合来避免它吗?