ThreadPoolTaskExecutor corePoolSize vs. maxPoolSize

1. Oversikt

Våren ThreadPoolTaskExecutor er en JavaBean som gir en abstraksjon rundt en java.util.concurrent.ThreadPoolExecutor eksempel og avslører det som en vår org.springframework.core.task.TaskExecutor. Videre er den svært konfigurerbar gjennom egenskapene til corePoolSize, maxPoolSize, queCapacity, allowCoreThreadTimeOut og keepAliveSeconds. I denne opplæringen vil vi se på corePoolSize og maxPoolSize eiendommer.

2. corePoolSize vs. maxPoolSize

Brukere som er nye for denne abstraksjonen, kan lett bli forvirret om forskjellen i de to konfigurasjonsegenskapene. La oss derfor se på hver for seg.

2.1. corePoolSize

De corePoolSize er minimum antall arbeidere for å holde seg i live uten tidsavbrudd. Det er en konfigurerbar egenskap til ThreadPoolTaskExecutor. Imidlertid, den ThreadPoolTaskExecutor abstraksjon delegerer å sette denne verdien til den underliggende java.util.concurrent.ThreadPoolExecutor. For å avklare kan det hende at alle tråder går ut av tid - effektivt setter verdien av corePoolSize til null hvis vi har satt allowCoreThreadTimeOut til ekte.

2.2. maxPoolSize

I kontrast, den maxPoolSize definerer maksimalt antall tråder som noensinne kan opprettes. Tilsvarende maxPoolSize tilhører ThreadPoolTaskExecutor delegerer også verdien til det underliggende java.util.concurrent.ThreadPoolExecutor. Å avklare, maxPoolSize kommer an på køKapasitet i det ThreadPoolTaskExecutor vil bare opprette en ny tråd hvis antallet varer i køen overstiger køKapasitet.

3. Så hva er forskjellen?

Forskjellen mellom corePoolSize og maxPoolSize kan virke tydelig. Imidlertid er det noen finesser angående deres oppførsel.

Når vi sender en ny oppgave til ThreadPoolTaskExecutor, det skaper en ny tråd hvis færre enn corePoolSize tråder kjører, selv om det er ledige tråder i bassenget, eller hvis færre enn maxPoolSize tråder kjører og køen defineres av køKapasitet er full.

Deretter, la oss se på noen koder for å se eksempler på når hver eiendom kommer til handling.

4. Eksempler

La oss først si at vi har en metode som utfører nye tråder, fra ThreadPoolTaskExecutor, navngitt startTråder:

public void startThreads (ThreadPoolTaskExecutor taskExecutor, CountDownLatch countDownLatch, int numThreads) {for (int i = 0; i {try {Thread.sleep (100L * ThreadLocalRandom.current (). nextLong (1, 10)); countDownLatch.countDown () ;} fange (InterruptedException e) {Thread.currentThread (). interrupt ();}}); }}

La oss teste standardkonfigurasjonen av ThreadPoolTaskExecutor, som definerer en corePoolSize av en tråd, en ubegrenset maxPoolSize, og en ubegrenset køKapasitet. Som et resultat forventer vi at uansett hvor mange oppgaver vi starter, vil vi bare ha en tråd som kjører:

@Test offentlig ugyldig nårUsingDefaults_thenSingleThread () {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor (); taskExecutor.afterPropertiesSet (); CountDownLatch countDownLatch = ny CountDownLatch (10); this.startThreads (taskExecutor, countDownLatch, 10); mens (countDownLatch.getCount ()> 0) {Assert.assertEquals (1, taskExecutor.getPoolSize ()); }}

La oss endre på corePoolSize til maksimalt fem tråder og sørg for at den oppfører seg som annonsert. Som et resultat forventer vi at fem tråder startes uansett antall oppgaver som sendes til ThreadPoolTaskExecutor:

@Test offentlig ugyldig nårCorePoolSizeFive_thenFiveThreads () {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor (); taskExecutor.setCorePoolSize (5); taskExecutor.afterPropertiesSet (); CountDownLatch countDownLatch = ny CountDownLatch (10); this.startThreads (taskExecutor, countDownLatch, 10); mens (countDownLatch.getCount ()> 0) {Assert.assertEquals (5, taskExecutor.getPoolSize ()); }}

På samme måte kan vi øke maxPoolSize til ti mens du forlater corePoolSize klokken fem. Som et resultat forventer vi å starte bare fem tråder. For å avklare starter bare fem tråder fordi køKapasitet er fortsatt ubegrenset:

@Test offentlig ugyldig nårCorePoolSizeFiveAndMaxPoolSizeTen_thenFiveThreads () {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor (); taskExecutor.setCorePoolSize (5); taskExecutor.setMaxPoolSize (10); taskExecutor.afterPropertiesSet (); CountDownLatch countDownLatch = ny CountDownLatch (10); this.startThreads (taskExecutor, countDownLatch, 10); mens (countDownLatch.getCount ()> 0) {Assert.assertEquals (5, taskExecutor.getPoolSize ()); }}

Videre gjentar vi nå forrige test, men øker køKapasitet til ti og start tjue tråder. Derfor forventer vi nå å starte ti tråder totalt:

@Test offentlig ugyldig nårCorePoolSizeFiveAndMaxPoolSizeTenAndQueueCapacityTen_thenTenThreads () {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor (); taskExecutor.setCorePoolSize (5); taskExecutor.setMaxPoolSize (10); taskExecutor.setQueueCapacity (10); taskExecutor.afterPropertiesSet (); CountDownLatch countDownLatch = ny CountDownLatch (20); this.startThreads (taskExecutor, countDownLatch, 20); mens (countDownLatch.getCount ()> 0) {Assert.assertEquals (10, taskExecutor.getPoolSize ()); }}

Likeledes hvis vi hadde satt køKapasitet til null og bare startet ti oppgaver, ville vi også ha ti tråder i vår ThreadPoolTaskExecutor.

5. Konklusjon

ThreadPoolTaskExecutor er en kraftig abstraksjon rundt en java.util.concurrent.ThreadPoolExecutor, som gir muligheter for å konfigurere corePoolSize, maxPoolSize, og køKapasitet. I denne opplæringen så vi på corePoolSize og maxPoolSize egenskaper, samt hvordan maxPoolSize fungerer sammen med køKapasitet, slik at vi enkelt kan lage trådbassenger for ethvert brukstilfelle.

Som alltid kan du finne koden tilgjengelig på Github.


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