parallelStream

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:

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

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

Pytanie chyba oczywiste :)
Dlaczego tak się dzieje?

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

3

Uzyj operacji .map i nastepnie .collect

List<Jakis_typ> list2 = list.parallelStream()
.map(w -> new Person(w, w + ""))
.collect(Collectors.toList());
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

1 użytkowników online, w tym zalogowanych: 0, gości: 1