Egyéni szálkészletek Java 8 párhuzamos adatfolyamokban

1. Áttekintés

A Java 8 bevezette az S fogalmátálmok mint az adatok tömeges műveleteinek végrehajtásának hatékony módja. És párhuzamosan Patakok az egyidejűséget támogató környezetekben lehet beszerezni.

Ezeknek az adatfolyamoknak a teljesítménye javulhat - többszálas menetek költségével.

Ebben a gyors bemutatóban megnézzük egyik legnagyobb korlátja Folyam API és megtudhatja, hogyan lehet egy párhuzamos adatfolyamot működtetni egy szokással ThreadPool például, alternatív megoldásként - van egy könyvtár, amely ezt kezeli.

2. Párhuzamos Folyam

Kezdjük egy egyszerű példával - a parallelStream módszer bármelyikére Gyűjtemény típusok - amelyek esetlegesen párhuzamosat adnak vissza Folyam:

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

Az ilyen alapértelmezett feldolgozás Folyam használja a ForkJoinPool.commonPool (),a Menetes medence az egész alkalmazás megosztja.

3. Egyedi Menetes medence

Valójában átadhatunk egy szokást ThreadPool a folyam.

A következő példa párhuzamot adhat Folyam használjon szokást Menetes medence a hosszú értékek összegének kiszámításához 1-től 1 000 000-ig, beleértve:

@Test public void giveRangeOfLongs_whenSummedInParallel_shouldBeEqualToExpectedTotal () dob InterruptedException, ExecutionException {long firstNum = 1; long lastNum = 1_000_000; List aList = LongStream.rangeClosed (firstNum, lastNum) .boxed () .collect (Collectors.toList ()); ForkJoinPool customThreadPool = új ForkJoinPool (4); long actualTotal = customThreadPool.submit (() -> aList.parallelStream (). csökkent (0L, Hosszú :: összeg)). get (); assertEquals ((utolsóNum + elsőNum) * lastNum / 2, tényleges Összesen); }

Használtuk a ForkJoinPool konstruktor, amelynek párhuzamossági szintje 4. Néhány kísérletre van szükség a különböző környezetek optimális értékének meghatározásához, de egy jó ökölszabály az, hogy egyszerűen kiválasztja a számot annak alapján, hogy a CPU hány maggal rendelkezik.

Ezután feldolgoztuk a párhuzam tartalmát Folyam, összefoglalva őket a csökkenteni hívás.

Lehet, hogy ez az egyszerű példa nem bizonyítja a szokás használatának teljes hasznosságát Menetes medence, de az előnyök nyilvánvalóvá válnak olyan helyzetekben, amikor nem akarjuk összekötni a közöset Menetes medence régóta futó feladatokkal (pl. hálózati forrásból származó adatok feldolgozása), vagy a közös Menetes medence az alkalmazáson belül más alkatrészek használják.

4. Következtetés

Röviden megvizsgáltuk, hogyan lehet párhuzamot vezetni Folyam szokás használatával Menetes medence. Megfelelő környezetben és a párhuzamossági szint megfelelő használatával bizonyos helyzetekben teljesítménynövekedés érhető el.

Az ebben a cikkben hivatkozott teljes kódminták a Github oldalon találhatók.