ThreadPoolTaskExecutor corePoolSize és maxPoolSize

1. Áttekintés

A tavasz ThreadPoolTaskExecutor egy JavaBean, amely absztrakciót nyújt az a körül java.util.concurrent.ThreadPoolExecutor példaként, és tavaszként tárja fel org.springframework.core.task.TaskExecutor. Továbbá nagyon konfigurálható a tulajdonságai révén corePoolSize, maxPoolSize, queueCapacity, allowCoreThreadTimeOut és keepAliveSeconds. Ebben az oktatóanyagban megnézzük a corePoolSize és maxPoolSize tulajdonságait.

2. corePoolSize vs. maxPoolSize

Az ebben az absztrakcióban új felhasználók könnyen megzavarodhatnak a két konfigurációs tulajdonság különbségében. Ezért nézzük meg mindegyiket önállóan.

2.1. corePoolSize

A corePoolSize a minimális életben tartandó munkavállalók száma időzítés nélkül. A. Konfigurálható tulajdonsága ThreadPoolTaskExecutor. Azonban a ThreadPoolTaskExecutor absztrakció delegálja ezt az értéket az alapul szolgálóra java.util.concurrent.ThreadPoolExecutor. Tisztázandó, hogy minden szál időtúlléphet - hatékonyan beállítva a corePoolSize nullára, ha beállítottuk allowCoreThreadTimeOut nak nek igaz.

2.2. maxPoolSize

Ezzel szemben a maxPoolSize meghatározza a valaha létrehozható szálak maximális számát. Hasonlóképpen a maxPoolSize tulajdona ThreadPoolTaskExecutor az értékét az alapul szolgálóra is átruházza java.util.concurrent.ThreadPoolExecutor. Hogy tisztázzuk, maxPoolSize attól függ queueCapacity abban ThreadPoolTaskExecutor csak akkor hoz létre új szálat, ha a sorában lévő elemek száma meghaladja queueCapacity.

3. Tehát mi a különbség?

A különbség corePoolSize és maxPoolSize nyilvánvalónak tűnhet. Van azonban néhány finomság a viselkedésükkel kapcsolatban.

Amikor új feladatot nyújtunk be a ThreadPoolTaskExecutor, új szálat hoz létre, ha kevesebb, mint corePoolSize szálak futnak, még akkor is, ha vannak üresjárati szálak a készletben, vagy ha kevesebb, mint maxPoolSize szálak futnak, és a sort a queueCapacity tele van.

Ezután nézzünk meg néhány kódot, hogy lássuk az egyes tulajdonságok működésbe lépésének példáit.

4. Példák

Először tegyük fel, hogy van egy módszerünk, amely új szálakat hajt végre a ThreadPoolTaskExecutor, nevezett startThreads:

public void startThreads (ThreadPoolTaskExecutor taskExecutor, CountDownLatch countDownLatch, int numThreads) {for (int i = 0; i {próbáld meg {Thread.sleep (100L * ThreadLocalRandom.current (). nextLong (1, 10)); countDownLatch.count ;} catch (InterruptedException e) {Szál.currentThread (). megszakítás ();}}); }}

Teszteljük a ThreadPoolTaskExecutor, amely meghatározza a corePoolSize egy szál, korlátlan maxPoolSize, és korlátlan queueCapacity. Ennek eredményeként arra számítunk, hogy függetlenül attól, hogy hány feladatot indítunk, csak egy szál fut majd:

@Test public void whenUsingDefaults_thenSingleThread () {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor (); taskExecutor.afterPropertiesSet (); CountDownLatch countDownLatch = new CountDownLatch (10); this.startThreads (taskExecutor, countDownLatch, 10); while (countDownLatch.getCount ()> 0) {Assert.assertEquals (1, taskExecutor.getPoolSize ()); }}

Most változtassuk meg a corePoolSize legfeljebb öt szálig, és biztosítsa, hogy a hirdetések szerint viselkedjen. Ennek eredményeként arra számítunk, hogy öt szál elindul, függetlenül a ThreadPoolTaskExecutor:

@Test public void whenCorePoolSizeFive_thenFiveThreads () {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor (); taskExecutor.setCorePoolSize (5); taskExecutor.afterPropertiesSet (); CountDownLatch countDownLatch = new CountDownLatch (10); this.startThreads (taskExecutor, countDownLatch, 10); while (countDownLatch.getCount ()> 0) {Assert.assertEquals (5, taskExecutor.getPoolSize ()); }}

Hasonlóképpen növelhetjük a maxPoolSize tízig, miközben elhagyja a corePoolSize ötkor. Ennek eredményeként arra számítunk, hogy csak öt szálat indítunk el. Hogy tisztázzuk, csak öt szál indul el, mert a queueCapacity még mindig korlátlan:

@Test public void whenCorePoolSizeFiveAndMaxPoolSizeTen_thenFiveThreads () {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor (); taskExecutor.setCorePoolSize (5); taskExecutor.setMaxPoolSize (10); taskExecutor.afterPropertiesSet (); CountDownLatch countDownLatch = new CountDownLatch (10); this.startThreads (taskExecutor, countDownLatch, 10); while (countDownLatch.getCount ()> 0) {Assert.assertEquals (5, taskExecutor.getPoolSize ()); }}

Ezután megismételjük az előző tesztet, de növeljük a queueCapacity tízig és kezdjen húsz szálat. Ezért most várhatóan összesen tíz szálat indítunk:

@Test public void whenCorePoolSizeFiveAndMaxPoolSizeTenAndQueueCapacityTen_thenTenThreads () {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor (); taskExecutor.setCorePoolSize (5); taskExecutor.setMaxPoolSize (10); taskExecutor.setQueueCapacity (10); taskExecutor.afterPropertiesSet (); CountDownLatch countDownLatch = new CountDownLatch (20); this.startThreads (taskExecutor, countDownLatch, 20); while (countDownLatch.getCount ()> 0) {Assert.assertEquals (10, taskExecutor.getPoolSize ()); }}

Hasonlóképpen, ha beállítottuk volna a queueCapactity nullára, és csak tíz feladatot indítottunk el, tíz szál is rendelkezésünkre áll ThreadPoolTaskExecutor.

5. Következtetés

ThreadPoolTaskExecutor egy erőteljes absztrakció a körül java.util.concurrent.ThreadPoolExecutor, opciókat biztosít a corePoolSize, maxPoolSize, és queueCapacity. Ebben az oktatóanyagban megnéztük a corePoolSize és maxPoolSize tulajdonságait, valamint hogyan maxPoolSize párhuzamosan működik queueCapacity, lehetővé téve számunkra, hogy bármilyen felhasználási esetre könnyedén létrehozzunk szálkészleteket.

Mint mindig, a Githubon is megtalálhatja a rendelkezésre álló kódot.


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