Mam kolekcję elementów, które chcę przetwarzać równolegle. Kiedy używam List
, działa równoległość. Jednak kiedy używam Set
, nie działa on równolegle.Strumień równoległy z HashSet nie działa równolegle
pisałem próbkę kodu, który pokazuje problem:
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);
}
Jest to wyjście, które dostaję na Windows 7
set print
start: 1
end: 1
start: 2
end: 2
list print
start: 2
start: 1
end: 1
end: 2
Widzimy, że pierwszy element z Set
musiał zakończyć przed przetworzeniem drugiego elementu. W przypadku modelu List
drugi element rozpoczyna się przed zakończeniem pierwszego elementu.
Czy możesz mi powiedzieć, co powoduje ten problem i jak tego uniknąć, używając kolekcji Set
?
spróbuj z więcej niż dwoma elementami, takimi jak 10. elementy lub coś takiego.wyniki z 2 są zbyt nieprecyzyjne. – nafas
Przy próbie z 10 nadal nie można połączyć wszystkich ustawionych elementów. I muszę uruchomić wszystkie elementy równolegle. – Nemo
Każdy sposób jest to wyjście do 10 (z puli 10 wykonawców) elementy wymienione drukowania początek 8 początek 0 start: 4 początkową 6 początek 2 koniec 2 koniec 6 koniec: 4 koniec 0 start: 1 koniec 8 start: 9 początkowa: 5 początek 7 start: 3 zakończenie: 3 koniec: 5 koniec: 9 koniec 7 koniec 1 lista druku start: 7 start: 3 początek 0 początkową 6 start: 9 początek 8 początkowa: 5 start: 4 początek 2 start: 1 koniec 0 koniec: 6 koniec 7 koniec: 9 koniec 2 zakończenie: 3 koniec 8 koniec: 5 koniec 1 zakończenie: 4 Nie wszystkie zestaw elementów prowadzony równolegle – Nemo