Prilagođeni bazeni niti u Javi 8 paralelnih tokova

1. Pregled

Java 8 predstavila je koncept Streamovi kao učinkovit način izvođenja skupnih operacija podataka. I paralelno Potoci mogu se dobiti u okruženjima koja podržavaju istodobnost.

Ti se tokovi mogu isporučiti s poboljšanim performansama - po cijenu višestrukih navoja iznad glave.

U ovom ćemo brzom vodiču pogledati jedno od najvećih ograničenja Stream API i pogledajte kako natjerati paralelni tok da radi s prilagođenim ThreadPool primjerice, alternativno - postoji biblioteka koja to rješava.

2. Paralelno Stream

Počnimo s jednostavnim primjerom - pozivanjem paralelni tok metoda na bilo kojem od Kolekcija vrste - što će vratiti moguće paralelu Stream:

@Test javna praznina givenList_whenCallingParallelStream_shouldBeParallelStream () {Popis aList = novi ArrayList (); Strim paralelni tok = aList.parallelStream (); assertTrue (parallelStream.isParallel ()); }

Zadana obrada koja se događa u takvom Stream koristi ForkJoinPool.commonPool (),a Bazen niti koju dijeli cijela aplikacija.

3. Prilagođeno Bazen niti

Zapravo možemo proći običaj ThreadPool pri obradi potok.

Sljedeći primjer omogućuje paralelu Stream koristiti običaj Bazen niti za izračunavanje zbroja dugih vrijednosti od 1 do 1.000.000, uključujući:

@Test public void giveRangeOfLongs_whenSummedInParallel_shouldBeEqualToExpectedTotal () baca InterruptedException, ExecutionException {long firstNum = 1; long lastNum = 1_000_000; Popis aList = LongStream.rangeClosed (firstNum, lastNum) .boxed () .collect (Collectors.toList ()); ForkJoinPool customThreadPool = novi ForkJoinPool (4); long actualTotal = customThreadPool.submit (() -> aList.parallelStream (). reduce (0L, Long :: sum)). get (); assertEquals ((lastNum + firstNum) * lastNum / 2, actualTotal); }

Koristili smo ForkJoinPool konstruktor s razinom paralelizma od 4. Potrebno je neko eksperimentiranje kako bi se utvrdila optimalna vrijednost za različita okruženja, ali dobro je jednostavno odabrati broj na temelju koliko jezgri ima vaš CPU.

Zatim smo obradili sadržaj paralele Stream, sažimajući ih u smanjiti poziv.

Ovaj jednostavan primjer možda neće pokazati punu korisnost korištenja prilagođenog Bazen niti, ali blagodati postaju očite u situacijama kada ne želimo vezati zajedničko Bazen niti s dugotrajnim zadacima (npr. obrada podataka iz mrežnog izvora) ili zajedničkim Bazen niti koriste druge komponente unutar aplikacije.

4. Zaključak

Ukratko smo pogledali kako voditi paralelu Stream koristeći običaj Bazen niti. U pravom okruženju i uz pravilnu upotrebu razine paralelizma, u određenim se situacijama mogu postići poboljšanja u izvedbi.

Cjelovite uzorke koda na koje se poziva ovaj članak možete pronaći na Githubu.