У меня есть набор элементов, которые я хочу обрабатывать параллельно. Когда я использую List
, работает параллелизм. Однако, когда я использую Set
, он не запускается параллельно.Параллельный поток из HashSet не работает параллельно
Я написал пример кода, который показывает проблему:
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 слишком расплывчатыми. – nafas
Когда вы попытаетесь с 10, вы все равно не можете параллельны всем заданным элементам. И мне нужно запускать все элементы параллельно. – Nemo
В любом случае, это выход на 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 Не все установленные элементы работают в параллельном – Nemo