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.