У меня есть набор элементов, которые я хочу обрабатывать параллельно. Когда я использую List
, parallelism работает. Однако, когда я использую 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);
}
Это результат, который я получаю на окнах 7
set print
start: 1
end: 1
start: 2
end: 2
list print
start: 2
start: 1
end: 1
end: 2
Мы видим, что первый элемент из Set
должен был закончить до обработки второго элемента. Для List
второй элемент начинается до завершения первого элемента.
Можете ли вы рассказать мне, что вызывает эту проблему, и как ее избежать с помощью коллекции Set
?