第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

使用@Async注解限制線程數(shù)并等待最大線程數(shù)

使用@Async注解限制線程數(shù)并等待最大線程數(shù)

慕工程0101907 2022-11-10 16:24:39
我將 Spring 的 Java 配置與 AsyncConfigurer 一起使用:@Configuration@EnableAsyncpublic class AppConfig implements AsyncConfigurer {@Overridepublic Executor getAsyncExecutor() {        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();        executor.setCorePoolSize(2);        executor.setMaxPoolSize(2);        executor.setQueueCapacity(10);        executor.setThreadNamePrefix("MyExecutor-");        executor.initialize();        return executor;    }}現(xiàn)在假設(shè)我有一個(gè)帶有 @Async 注釋的方法,并假設(shè)它已經(jīng)調(diào)用了 2 次并且 2 個(gè)線程仍在運(yùn)行。根據(jù)我的理解,對(duì)它的任何新調(diào)用都將添加到容量為 10 的隊(duì)列中。現(xiàn)在如果我收到第 11 個(gè)任務(wù),它的行為會(huì)是什么?它會(huì)拒絕此處所述的任務(wù):https ://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html ?還是調(diào)用者會(huì)等待隊(duì)列槽變空?我的要求是不要執(zhí)行使用@Async 方法生成的固定數(shù)量的線程,并在達(dá)到最大線程數(shù)時(shí)讓調(diào)用者等待。如果我將 ConcurrentTaskExecutor 與特定大小的固定線程池一起使用,這會(huì)實(shí)現(xiàn)嗎?
查看完整描述

2 回答

?
侃侃爾雅

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超16個(gè)贊

我想限制可能的線程數(shù),同時(shí)不丟失任何消息。我的這個(gè)要求沒有從現(xiàn)有的答案中得到滿足,我找到了另一種方法來做到這一點(diǎn)。因此,將其發(fā)布為答案:


我制作了一個(gè) Executor Bean,如下所示:


@Bean(name = "CustomAsyncExecutor")

public Executor customThreadPoolTaskExecutor() {

    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

    executor.setCorePoolSize(5);

    executor.setMaxPoolSize(5);

    executor.setQueueCapacity(0);

    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

    executor.setThreadNamePrefix("Async_Thread_");

    executor.setWaitForTasksToCompleteOnShutdown(true);

    executor.initialize();

    return executor;

}

然后使用


@Async("CustomAsyncExecutor")

public void methodName(){

....

}

鑒于當(dāng)線程忙且隊(duì)列已滿時(shí),新任務(wù)會(huì)被拒絕,


executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy())


幫助我,當(dāng)我的 5 個(gè)線程很忙時(shí),我的調(diào)用者線程將執(zhí)行任務(wù),并且由于我的調(diào)用者線程在異步函數(shù)中,它不會(huì)執(zhí)行任何新任務(wù)。因此,我不會(huì)在不增加隊(duì)列大小的情況下放棄我的任務(wù)。


查看完整回答
反對(duì) 回復(fù) 2022-11-10
?
慕哥9229398

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊

根據(jù) ThreadPoolExecutor 的工作原理,第 11 個(gè)任務(wù)將被拒絕,因?yàn)楫?dāng)隊(duì)列已滿時(shí),執(zhí)行程序會(huì)嘗試增加池大小,如果由于達(dá)到最大值而無法執(zhí)行,則會(huì)拒絕該任務(wù)。
您可以在 Spring 文檔中找到相關(guān)信息:

主要思想是,當(dāng)提交任務(wù)時(shí),如果當(dāng)前活動(dòng)線程數(shù)小于核心大小,則執(zhí)行程序首先嘗試使用空閑線程。如果已達(dá)到核心大小,則將任務(wù)添加到隊(duì)列中,只要其容量尚未達(dá)到。只有這樣,如果隊(duì)列的容量已經(jīng)達(dá)到,執(zhí)行程序才會(huì)創(chuàng)建一個(gè)超出核心大小的新線程。如果也達(dá)到了最大大小,則執(zhí)行者拒絕該任務(wù)。

關(guān)于您的要求:

我的要求是不要執(zhí)行使用@Async 方法生成的固定數(shù)量的線程,并在達(dá)到最大線程數(shù)時(shí)讓調(diào)用者等待。如果我將 ConcurrentTaskExecutor 與特定大小的固定線程池一起使用,這會(huì)實(shí)現(xiàn)嗎?

因此,因此增加隊(duì)列大小并為核心和最大池大小保留相同的值。OutOfMemoryError您也可以使用無界隊(duì)列,它是隊(duì)列大小參數(shù)的默認(rèn)值,但要小心,因?yàn)槿绻?duì)列中堆積了太多任務(wù) ,可能會(huì)導(dǎo)致這種情況。


查看完整回答
反對(duì) 回復(fù) 2022-11-10
  • 2 回答
  • 0 關(guān)注
  • 492 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)