Vlastné oblasti vlákien v paralelných prúdoch Java 8

1. Prehľad

Java 8 predstavila koncept Spotoky ako efektívny spôsob vykonávania hromadných operácií s údajmi. A paralelne Prúdy je možné získať v prostrediach, ktoré podporujú súbežnosť.

Tieto streamy môžu prísť so zlepšeným výkonom - za cenu režie s viacerými vláknami.

V tomto rýchlom návode sa pozrieme na jedno z najväčších obmedzení Prúd API a uvidíme, ako dosiahnuť, aby paralelný prúd fungoval so zvykom ThreadPool napríklad - existuje knižnica, ktorá to zvláda.

2. Paralelné Prúd

Začnime jednoduchým príkladom - volaním súboru paralelný prúd metóda na ktoromkoľvek z týchto spôsobov Zbierka typy - ktoré vrátia prípadnú paralelu Prúd:

@Test public void givenList_whenCallingParallelStream_shouldBeParallelStream () {List aList = new ArrayList (); Streamovať paralelneStream = aList.parallelStream (); assertTrue (parallelStream.isParallel ()); }

Predvolené spracovanie, ktoré sa vyskytuje v takomto a Prúd používa ForkJoinPool.commonPool (),a Pool závitov zdieľa celá aplikácia.

3. Vlastné Pool závitov

Vlastne môžeme prejsť zvykom ThreadPool pri spracovaní Prúd.

Nasledujúci príklad umožňuje mať paralelu Prúd použite zvyk Pool závitov vypočítať súčet dlhých hodnôt od 1 do 1 000 000 vrátane:

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

Použili sme ForkJoinPool konštruktor s úrovňou paralelizmu 4. Na stanovenie optimálnej hodnoty pre rôzne prostredia je potrebné určité experimentovanie, dobrým pravidlom však je jednoducho zvoliť počet na základe počtu jadier vášho procesora.

Ďalej sme spracovali obsah paralely Prúd, ich zhrnutie do zmenšiť hovor.

Tento jednoduchý príklad nemusí demonštrovať úplnú užitočnosť použitia zvyku Pool závitov, ale výhody sa prejavia v situáciách, keď nechceme viazať spoločné Pool závitov s dlhodobými úlohami (napr. spracovanie údajov zo sieťového zdroja) alebo bežné Pool závitov je používaný inými komponentmi v rámci aplikácie.

4. Záver

Krátko sme sa pozreli na to, ako paralelne postupovať Prúd pomocou zvyku Pool závitov. V správnom prostredí a pri správnom použití úrovne paralelizmu možno v určitých situáciách dosiahnuť zvýšenie výkonnosti.

Kompletné ukážky kódu, na ktoré sa odkazuje v tomto článku, nájdete na Github.


$config[zx-auto] not found$config[zx-overlay] not found