Spring Boot使用@Async實現(xiàn)異步調(diào)用——自定義線程池

系列文章推薦閱讀順序:

  1. Spring Boot使用@Async實現(xiàn)異步調(diào)用
  2. Spring Boot使用@Async實現(xiàn)異步調(diào)用——自定義線程池

對于異步執(zhí)行的控制是我們保障自身應(yīng)用健康的基本技能句旱。本文通過自定義線程池的方式來控制異步調(diào)用的并發(fā)。

一、定義線程池

第一步蛤迎,先在Spring Boot主類中定義一個線程池薯嗤,比如:

package com.erbadagang.springboot.async;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

@SpringBootApplication
@EnableAsync
public class AsyncApplication {

    public static void main(String[] args) {
        SpringApplication.run(AsyncApplication.class, args);
    }

    @Configuration
    @EnableAsync
    class TaskPoolConfig {

        @Bean("taskExecutor")
        public Executor taskExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(10);
            executor.setMaxPoolSize(20);
            executor.setQueueCapacity(200);
            executor.setKeepAliveSeconds(60);
            executor.setThreadNamePrefix("guoxiuzhiTE-");
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
            return executor;
        }
    }
}

上面我們通過使用ThreadPoolTaskExecutor創(chuàng)建了一個線程池买窟,同時設(shè)置了以下這些參數(shù):

  1. 核心線程數(shù)10:線程池創(chuàng)建時候初始化的線程數(shù)
  2. 最大線程數(shù)20:線程池最大的線程數(shù)登渣,只有在緩沖隊列滿了之后才會申請超過核心線程數(shù)的線程
  3. 緩沖隊列200:用來緩沖執(zhí)行任務(wù)的隊列
  4. 允許線程的空閑時間60秒:當超過了核心線程出之外的線程在空閑時間到達之后會被銷毀
  5. 線程池名的前綴:設(shè)置好了之后可以方便我們定位處理任務(wù)所在的線程池
  6. 線程池對拒絕任務(wù)的處理策略:這里采用了CallerRunsPolicy策略摊求,當線程池沒有處理能力的時候嘉抓,該策略會直接在 execute 方法的調(diào)用線程中運行被拒絕的任務(wù)索守;如果執(zhí)行程序已關(guān)閉,則會丟棄該任務(wù)

二抑片、使用線程池

在定義了線程池之后卵佛,我們?nèi)绾巫尞惒秸{(diào)用的執(zhí)行任務(wù)使用這個線程池中的資源來運行呢?方法非常簡單,我們只需要在@Async注解中指定線程池名即可截汪,比如:

package com.erbadagang.springboot.async.task;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import java.util.Random;

/**
 * @description 通過線程池異步調(diào)用
 * @ClassName: AsyncTask
 * @author: 郭秀志 jbcode@126.com
 * @date: 2020/7/24 11:08
 * @Copyright:
 */
@Component
@Slf4j
public class AsyncTaskWithThreadPool {

    public static Random random = new Random();

    @Async("taskExecutor")
    public void doTaskOne() throws Exception {
        log.info("開始做任務(wù)一");
        long start = System.currentTimeMillis();
        Thread.sleep(random.nextInt(5000));
        long end = System.currentTimeMillis();
        log.info("完成任務(wù)一疾牲,耗時:" + (end - start) + "毫秒");
    }

    @Async("taskExecutor")
    public void doTaskTwo() throws Exception {
        log.info("開始做任務(wù)二");
        long start = System.currentTimeMillis();
        Thread.sleep(random.nextInt(5000));
        long end = System.currentTimeMillis();
        log.info("完成任務(wù)二,耗時:" + (end - start) + "毫秒");
    }

    @Async("taskExecutor")
    public void doTaskThree() throws Exception {
        log.info("開始做任務(wù)三");
        long start = System.currentTimeMillis();
        Thread.sleep(random.nextInt(5000));
        long end = System.currentTimeMillis();
        log.info("完成任務(wù)三衙解,耗時:" + (end - start) + "毫秒");
    }

}

為了日志輸出線程名阳柔,使用了@Slf4j,需要引入依賴

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>

我們來寫個單元測試來驗證一下

    @Autowired
    private AsyncTaskWithThreadPool asyncTaskWithThreadPool;

    @Test
    public void test() throws Exception {

        asyncTaskWithThreadPool.doTaskOne();
        asyncTaskWithThreadPool.doTaskTwo();
        asyncTaskWithThreadPool.doTaskThree();

        Thread.currentThread().join();
    }

執(zhí)行上面的單元測試,我們可以在控制臺中看到所有輸出的線程名前都是之前我們定義的線程池前綴名開始的蚓峦,說明我們使用線程池來執(zhí)行異步任務(wù)的試驗成功了舌剂!

2020-07-24 11:29:08.783  INFO 11588 --- [  guoxiuzhiTE-1] c.e.s.a.task.AsyncTaskWithThreadPool     : 開始做任務(wù)一
2020-07-24 11:29:08.783  INFO 11588 --- [  guoxiuzhiTE-3] c.e.s.a.task.AsyncTaskWithThreadPool     : 開始做任務(wù)三
2020-07-24 11:29:08.783  INFO 11588 --- [  guoxiuzhiTE-2] c.e.s.a.task.AsyncTaskWithThreadPool     : 開始做任務(wù)二

底線


本文源代碼使用 Apache License 2.0開源許可協(xié)議,可從如下Gitee地址免費獲取代碼通過git clone命令下載到本地或者直接點擊鏈接通過瀏覽器方式查看源代碼枫匾。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末架诞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子干茉,更是在濱河造成了極大的恐慌谴忧,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件角虫,死亡現(xiàn)場離奇詭異沾谓,居然都是意外死亡,警方通過查閱死者的電腦和手機戳鹅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門均驶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人枫虏,你說我怎么就攤上這事妇穴。” “怎么了隶债?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵腾它,是天一觀的道長。 經(jīng)常有香客問我死讹,道長瞒滴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任赞警,我火速辦了婚禮妓忍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘愧旦。我一直安慰自己世剖,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布忘瓦。 她就那樣靜靜地躺著搁廓,像睡著了一般引颈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上境蜕,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天蝙场,我揣著相機與錄音,去河邊找鬼粱年。 笑死售滤,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的台诗。 我是一名探鬼主播完箩,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拉队!你這毒婦竟也來了弊知?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤粱快,失蹤者是張志新(化名)和其女友劉穎秩彤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體事哭,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡漫雷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鳍咱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片降盹。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谤辜,靈堂內(nèi)的尸體忽然破棺而出蓄坏,到底是詐尸還是另有隱情,我是刑警寧澤丑念,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布剑辫,位于F島的核電站,受9級特大地震影響渠欺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜椎眯,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一挠将、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧编整,春花似錦舔稀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春夜郁,著一層夾襖步出監(jiān)牢的瞬間什燕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工竞端, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屎即,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓事富,卻偏偏與公主長得像技俐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子统台,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355