Egendefinerte trådbassenger i Java 8 parallelle strømmer

1. Oversikt

Java 8 introduserte konseptet Stråder som en effektiv måte å utføre bulkoperasjoner på data på. Og parallelt Strømmer kan fås i miljøer som støtter samtidighet.

Disse strømmene kan komme med forbedret ytelse - på bekostning av flertrådende overhead.

I denne raske opplæringen vil vi se på en av de største begrensningene av Strøm API og se hvordan du får en parallell strøm til å fungere med en tilpasset ThreadPool eksempel, alternativt - det er et bibliotek som håndterer dette.

2. Parallell Strøm

La oss starte med et enkelt eksempel - å kalle parallelStream metode på noen av Samling typer - som vil returnere en mulig parallell Strøm:

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

Standardbehandling som skjer i et slikt Strøm bruker ForkJoinPool.commonPool (),en Trådbasseng deles av hele søknaden.

3. Tilpasset Trådbasseng

Vi kan faktisk passere en skikk ThreadPool når du behandler strøm.

Følgende eksempel kan ha en parallell Strøm bruk en egendefinert Trådbasseng for å beregne summen av lange verdier fra 1 til 1 000 000, inkludert:

@Test offentlig ugyldig giveRangeOfLongs_whenSummedInParallel_shouldBeEqualToExpectedTotal () kaster InterruptedException, ExecutionException {long firstNum = 1; long lastNum = 1_000_000; Liste aList = LongStream.rangeClosed (firstNum, lastNum) .boxed () .collect (Collectors.toList ()); ForkJoinPool customThreadPool = ny ForkJoinPool (4); long actualTotal = customThreadPool.submit (() -> aList.parallelStream (). reduser (0L, Long :: sum)). get (); assertEquals ((lastNum + firstNum) * lastNum / 2, actualTotal); }

Vi brukte ForkJoinPool konstruktør med parallellitetsnivå på 4. Noe eksperimentering er nødvendig for å bestemme den optimale verdien for forskjellige miljøer, men en god tommelfingerregel er ganske enkelt å velge nummer basert på hvor mange kjerner CPU-en din har.

Deretter behandlet vi innholdet i parallellen Strøm, oppsummerer dem i redusere anrop.

Dette enkle eksemplet viser kanskje ikke full nytte av å bruke en tilpasset Trådbasseng, men fordelene blir tydelige i situasjoner der vi ikke ønsker å binde det vanlige Trådbasseng med langvarige oppgaver (f.eks. behandling av data fra en nettverkskilde), eller det vanlige Trådbasseng brukes av andre komponenter i applikasjonen.

4. Konklusjon

Vi har kort sett på hvordan vi skal kjøre en parallell Strøm ved hjelp av en tilpasset Trådbasseng. I riktig miljø og med riktig bruk av parallellitetsnivået kan ytelsesgevinster oppnås i visse situasjoner.

De komplette kodeeksemplene det er referert til i denne artikkelen, kan du finne på Github.