Spring-boot 使用線程池

線程池就是首先創(chuàng)建一些線程,它們的集合稱為線程池弃锐。使用線程池可以很好地提高性能,線程池在系統(tǒng)啟動時即創(chuàng)建大量空閑的線程霹菊,程序將一個任務傳給線程池旋廷,線程池就會啟動一條線程來執(zhí)行這個任務饶碘,執(zhí)行結束以后,該線程并不會死亡扎运,而是再次返回線程池中成為空閑狀態(tài),等待執(zhí)行下一個任務豪治。

四種常用的線程池

  • Executors.newCacheThreadPool():可緩存線程池
  • Executors.newFixedThreadPool(int n):創(chuàng)建一個可重用固定個數的線程池负拟,以共享的無界隊列方式來運行這些線程。
  • Executors.newScheduledThreadPool(int n):創(chuàng)建一個定長線程池花吟,支持定時及周期性任務執(zhí)行
  • Executors.newSingleThreadExecutor():創(chuàng)建一個單線程化的線程池厨姚,它只會用唯一的工作線程來執(zhí)行任務,保證所有任務按照指定順序(FIFO, LIFO, 優(yōu)先級)執(zhí)行谬墙。

spring-boot 新建自定義線程池

我們的需要新建一個Configuration 類來配置我們的線程池參數芭梯。

package com.uhi.applyment4sub.config;

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.ThreadPoolExecutor;

/**
 * @author adoreFT
 * @date 2021/01/13 16:19
 * @Description: uhi線程池配置類
 */
@Configuration
@EnableAsync
public class ThreadPoolTaskConfig {

  /**
   *   默認情況下,在創(chuàng)建了線程池后玖喘,線程池中的線程數為0累奈,當有任務來之后,就會創(chuàng)建一個線程去執(zhí)行任務搞乏,
   *    當線程池中的線程數目達到corePoolSize后,就會把到達的任務放到緩存隊列當中请敦;
   *  當隊列滿了,就繼續(xù)創(chuàng)建線程侍筛,當線程數量大于等于maxPoolSize后匣椰,開始使用拒絕策略拒絕
   */

    /**
     * 核心線程數(默認線程數)
     */
    private static final int corePoolSize = 5;
    /**
     * 最大線程數
     */
    private static final int maxPoolSize = 30;
    /**
     * 允許線程空閑時間(單位:默認為秒)
     */
    private static final int keepAliveTime = 30;
    /**
     * 緩沖隊列大小
     */
    private static final int queueCapacity = 10000;
    /**
     * 線程池名前綴
     */
    private static final String threadNamePrefix = "hdl-uhi-service-";

    @Bean("taskExecutor") // bean的名稱,默認為首字母小寫的方法名
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.setKeepAliveSeconds(keepAliveTime);
        executor.setThreadNamePrefix(threadNamePrefix);

        // 線程池對拒絕任務的處理策略
        // CallerRunsPolicy:由調用線程(提交任務的線程)處理該任務
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 初始化
        executor.initialize();
        return executor;
    }
}

其中我們的靜態(tài)參數也可以放在配置文件中入录,我這邊使用的 yml 配置文件:

#線程池配置參數
task:
  pool:
    corePoolSize: 5 #設置核心線程數
    maxPoolSize: 20  #設置最大線程數
    keepAliveSeconds: 300 #設置線程活躍時間(秒)
    queueCapacity: 50 #設置隊列容量

上邊的這里需要用注解來引用對象方式實現:

@ConfigurationProperties(prefix = "task.pool")

注解解釋

@Configuration用于定義配置類佳镜,被注解的類內部包含有一個或多個被@Bean注解的方法邀杏,這些方法將會被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext類進行掃描,并用于構建bean定義望蜡,初始化Spring容器。
@EnableAsync開始對異步任務的支持
@Async 定義一個線程任務
@Bean 產生一個Bean對象谢肾,然后這個Bean對象交給Spring管理 (如上:@Bean("taskExecutor"))

線程使用

  • 引用線程池
    @Autowired
    @Qualifier(value = "taskExecutor")
    private ThreadPoolTaskExecutor poolTaskExecutor;
  • 異步方法定義
      //根據組織做數據更新以及新增刪除
        for (UhiDdOrgContrast orgContrast : orgContrastList) {
            poolTaskExecutor.execute(() -> {
                userPackAgeData(token, orgContrast);
            });
        }

userPackAgeData 方法添加指定線程名:

 @Async("taskExecutor")
  public void userPackAgeData(String token, UhiDdOrgContrast orgContrast) {
    //業(yè)務代碼實現
    // XXXX
  }
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末芦疏,一起剝皮案震驚了整個濱河市酸茴,隨后出現的幾起案子兢交,更是在濱河造成了極大的恐慌,老刑警劉巖酪穿,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晴裹,死亡現場離奇詭異,居然都是意外死亡只磷,警方通過查閱死者的電腦和手機喳瓣,發(fā)現死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來配乓,“玉大人惠毁,你說我怎么就攤上這事崎页。” “怎么了飒焦?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵翁巍,是天一觀的道長休雌。 經常有香客問我灶壶,道長驰凛,這世上最難降的妖魔是什么担扑? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮胚宦,結果婚禮上洁奈,老公的妹妹穿的比我還像新娘。我一直安慰自己利术,他們只是感情好,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布被冒。 她就那樣靜靜地躺著,像睡著了一般轮蜕。 火紅的嫁衣襯著肌膚如雪昨悼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天跃洛,我揣著相機與錄音率触,去河邊找鬼。 笑死汇竭,一個胖子當著我的面吹牛葱蝗,可吹牛的內容都是我干的穴张。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼两曼,長吁一口氣:“原來是場噩夢啊……” “哼皂甘!你這毒婦竟也來了?” 一聲冷哼從身側響起悼凑,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤偿枕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后渐夸,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡桃纯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年棒拂,在試婚紗的時候發(fā)現自己被綠了帚屉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喻旷。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖锋谐,靈堂內的尸體忽然破棺而出涮拗,到底是詐尸還是另有隱情歧蕉,我是刑警寧澤赌髓,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布夷野,位于F島的核電站悯搔,受9級特大地震影響,放射性物質發(fā)生泄漏灌曙。R本人自食惡果不足惜在刺,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颖杏。 院中可真熱鬧,春花似錦欲鹏、人聲如沸赔嚎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瘦棋,卻和暖如春赌朋,著一層夾襖步出監(jiān)牢的瞬間沛慢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留圾另,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像汗唱,于是被迫代替她去往敵國和親哩罪。 傳聞我的和親對象是個殘疾皇子碘耳,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內容