ThreadPoolTaskExecutor corePoolSize vs. maxPoolSize

1. Oversigt

Foråret ThreadPoolTaskExecutor er en JavaBean, der giver en abstraktion omkring en java.util.concurrent.ThreadPoolExecutor eksempel og afslører det som en forår org.springframework.core.task.TaskExecutor. Yderligere er det meget konfigurerbart gennem egenskaberne af corePoolSize, maxPoolSize, queCapacity, allowCoreThreadTimeOut og keepAliveSeconds. I denne vejledning ser vi på corePoolSize og maxPoolSize ejendomme.

2. corePoolSize vs. maxPoolSize

Brugere, der er nye med denne abstraktion, kan let blive forvirrede over forskellen i de to konfigurationsegenskaber. Lad os derfor se på hver enkelt uafhængigt.

2.1. corePoolSize

Det corePoolSize er det mindste antal arbejdere, der kan holde sig i live uden tidsindstilling. Det er en konfigurerbar egenskab af ThreadPoolTaskExecutor. Men den ThreadPoolTaskExecutor abstraktion delegerer, der indstiller denne værdi til den underliggende java.util.concurrent.ThreadPoolExecutor. For at afklare, kan alle tråde gå timeout - effektivt indstille værdien af corePoolSize til nul, hvis vi har sat allowCoreThreadTimeOut til rigtigt.

2.2. maxPoolSize

I modsætning hertil er maxPoolSize definerer det maksimale antal tråde, der nogensinde kan oprettes. Tilsvarende er maxPoolSize ejendom af ThreadPoolTaskExecutor delegerer også sin værdi til det underliggende java.util.concurrent.ThreadPoolExecutor. For at afklare, maxPoolSize afhænger af køKapacitet i det ThreadPoolTaskExecutor opretter kun en ny tråd, hvis antallet af varer i dens kø overstiger køKapacitet.

3. Så hvad er forskellen?

Forskellen på corePoolSize og maxPoolSize kan synes tydeligt. Der er dog nogle finesser vedrørende deres adfærd.

Når vi sender en ny opgave til ThreadPoolTaskExecutor, det opretter en ny tråd, hvis færre end corePoolSize tråde kører, selvom der er ledige tråde i poolen, eller hvis færre end maxPoolSize tråde kører, og køen defineres af køKapacitet er fuld.

Lad os derefter se på nogle koder for at se eksempler på, hvornår hver ejendom springer i aktion.

4. Eksempler

Lad os sige, at vi har en metode, der udfører nye tråde fra ThreadPoolTaskExecutor, som hedder startThreads:

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 ();}}); }}

Lad os teste standardkonfigurationen af ThreadPoolTaskExecutor, der definerer en corePoolSize af en tråd, en ubegrænset maxPoolSize, og en ubegrænset køKapacitet. Som et resultat forventer vi, at uanset hvor mange opgaver vi starter, har vi kun en tråd, der kører:

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

Lad os nu ændre på corePoolSize til maksimalt fem tråde og sørg for, at den opfører sig som annonceret. Som et resultat forventer vi, at der startes fem tråde uanset antallet af opgaver, der sendes til ThreadPoolTaskExecutor:

@Test offentlig ugyldig nårCorePoolSizeFive_thenFiveThreads () {ThreadPoolTaskExecutor taskExecutor = ny 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åde kan vi øge maxPoolSize til ti, mens du forlader corePoolSize klokken fem. Som et resultat forventer vi kun at starte fem tråde. For at afklare starter kun fem tråde, fordi køKapacitet er stadig ubegrænset:

@Test offentlig ugyldig nårCorePoolSizeFiveAndMaxPoolSizeTen_thenFiveThreads () {ThreadPoolTaskExecutor taskExecutor = ny 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 ()); }}

Yderligere gentager vi nu den forrige test, men øger køKapacitet til ti og start tyve tråde. Derfor forventer vi nu at starte ti tråde i alt:

@Test offentlig ugyldigt 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 ()); }}

Ligeledes hvis vi havde indstillet køKapacitet til nul og kun startet ti opgaver, ville vi også have ti tråde i vores ThreadPoolTaskExecutor.

5. Konklusion

ThreadPoolTaskExecutor er en kraftig abstraktion omkring en java.util.concurrent.ThreadPoolExecutor, der giver muligheder for at konfigurere corePoolSize, maxPoolSizeog køKapacitet. I denne vejledning så vi på corePoolSize og maxPoolSize egenskaber samt hvordan maxPoolSize arbejder sammen med køKapacitet, der giver os mulighed for nemt at oprette trådpuljer til enhver brugssag.

Som altid kan du finde den tilgængelige kode på Github.


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