parallelStream

D9
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 3 lata
  • 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:ponad 8 lat
  • Ostatnio:minuta
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
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


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 3x, ostatnio: jarekr000000
xxxmateusz00xxx
  • Rejestracja:około 11 lat
  • Ostatnio:około rok
  • 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());
edytowany 4x, ostatnio: xxxmateusz00xxx
D9
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 3 lata
  • 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

jarekr000000
przy okazji - odpowiedź z collect (wyżej) jest lepszym rozwiązaniem problemu niż CopyOnWriteSomethingSomething

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.