parallelStream

D9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0

Chciałbym żeby wszystkie wątki wykonały pewien fragment kodu. Co przyszło 1 na myśl- parralelStream.
No i zaczynam od testów jak to działa i tu bęc, zaskoczenie.

Mam listę wypełnioną jakimiś obiektami, robię na niej parallelStream coś przerabiam i tworzę nowe obiekty które dodaje do listy(lista pusta przed operacją parallelStream).
No i teraz:
Spodziewałbym się, że ta druga lista będzie miała taki sam rozmiar i jak przetwarzam na zwykłym streamie oczywiście tak jest.
Przy parallel - ta druga lista to jakieś 90% tej pierwszej.

Kod wygląda mniej więcej tak:

Kopiuj
        list.parallelStream().forEach(w -> {

            Person person = new Person(w,w+"");
            list2.add(person);
        });

Pytanie chyba oczywiste :)
Dlaczego tak się dzieje?

jarekr000000
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: U krasnoludów - pod górą
  • Postów: 4712
8

Pomijając dramat całego kodu, to błąd jest jeszcze przed kodem, który wkleiłeś.
Gdzieś tam pewnie masz List list2 = new ArrayList().
ArrayList się do takiego dodawnia nie nadaje.
Lepiej zadziała: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArrayList.html

xxxmateusz00xxx
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 45
3

Uzyj operacji .map i nastepnie .collect

Kopiuj
List<Jakis_typ> list2 = list.parallelStream()
.map(w -> new Person(w, w + ""))
.collect(Collectors.toList());
D9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0
jarekr000000 napisał(a):

Pomijając dramat całego kodu, to błąd jest jeszcze przed kodem, który wkleiłeś.
Gdzieś tam pewnie masz List list2 = new ArrayList().
ArrayList się do takiego dodawnia nie nadaje.
Lepiej zadziała: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArrayList.html

Trafiłeś oczywiście.
Dziękuję za pomoc

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.