最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中的ThreadPoolTaskExecutor線(xiàn)程池使用詳解

 更新時(shí)間:2024年01月31日 10:19:17   作者:卷不動(dòng)躺不平的粥  
這篇文章主要介紹了Spring中的ThreadPoolTaskExecutor線(xiàn)程池使用詳解,ThreadPoolTaskExecutor 是 Spring框架提供的一個(gè)線(xiàn)程池實(shí)現(xiàn),用于管理和執(zhí)行多線(xiàn)程任務(wù),它是TaskExecutor接口的實(shí)現(xiàn),提供了在 Spring 應(yīng)用程序中創(chuàng)建和配置線(xiàn)程池的便捷方式,需要的朋友可以參考下

一、配置

1.1 將 ThreadPoolTaskExecutor 注入到 spring 容器內(nèi)

@Configuration
public class ThreadTaskPoolExecutorConfiguration {
    @Bean
    public ThreadPoolTaskExecutor threadPoolTaskExecutor(){
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        // 核心線(xiàn)程數(shù)
        taskExecutor.setCorePoolSize(5);
        // 最大線(xiàn)程數(shù)
        taskExecutor.setMaxPoolSize(15);
        // 隊(duì)列大小 默認(rèn)使用LinkedBlockingQueue
        taskExecutor.setQueueCapacity(100);
        // 線(xiàn)程最大空閑時(shí)間
        taskExecutor.setKeepAliveSeconds(300);
        // 拒絕策略 默認(rèn)new ThreadPoolExecutor.AbortPolicy()
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 線(xiàn)程名稱(chēng)前綴
        taskExecutor.setThreadNamePrefix("My-Task-Executor-");
        //交給spring托管的會(huì)自動(dòng)初始化,因?yàn)閷?shí)現(xiàn)了InitializingBean接口
        // taskExecutor.initialize();
        return taskExecutor;
    }
}

1.2 拒絕策略配置

rejectedExecutionHandler 字段用于配置拒絕策略,常用的拒絕策略如下:

  • AbortPolicy:用于被拒絕任務(wù)的處理程序,它將拋出 RejectedExecutionException。
  • CallerRunsPolicy:用于被拒絕任務(wù)的處理程序,它直接在 execute 方法的調(diào)用線(xiàn)程中運(yùn)行被拒絕的任務(wù)。
  • DiscardOldestPolicy:用于被拒絕任務(wù)的處理程序,它放棄最舊的未處理請(qǐng)求,然后重試 execute。
  • DiscardPolicy:用于被拒絕任務(wù)的處理程序,默認(rèn)情況下它將丟棄被拒絕的任務(wù)。

其他說(shuō)明:

  • 為了實(shí)現(xiàn)某些特殊的業(yè)務(wù)需求,用戶(hù)可以選擇使用自定義策略,只需實(shí)現(xiàn)RejectedExecutionHandler接口即可。
  • 建議配置threadNamePrefix屬性,出問(wèn)題時(shí)可以更方便的進(jìn)行排查。

1.3 配置線(xiàn)程池個(gè)數(shù)

  • 如果是 CPU 密集型任務(wù),那么線(xiàn)程池的線(xiàn)程個(gè)數(shù)應(yīng)該盡量少一些,一般為 CPU 的個(gè)數(shù)+1條線(xiàn)程。
  • 如果是 IO 密集型任務(wù),那么線(xiàn)程池的線(xiàn)程可以放的很大,如 2*CPU 的個(gè)數(shù)。
  • 對(duì)于混合型任務(wù),如果可以拆分的話(huà),通過(guò)拆分成 CPU 密集型和 IO 密集型兩種來(lái)提高執(zhí)行效率;如果不能拆分的的話(huà)就可以根據(jù)實(shí)際情況來(lái)調(diào)整線(xiàn)程池中線(xiàn)程的個(gè)數(shù)

二、處理流程

  1. 當(dāng)一個(gè)任務(wù)被提交到線(xiàn)程池時(shí),首先查看線(xiàn)程池的核心線(xiàn)程是否都在執(zhí)行任務(wù),否就選擇一條線(xiàn)程執(zhí)行任務(wù),是就執(zhí)行第二步。
  2. 查看核心線(xiàn)程池是否已滿(mǎn),不滿(mǎn)就創(chuàng)建一條線(xiàn)程執(zhí)行任務(wù),否則執(zhí)行第三步。
  3. 查看任務(wù)隊(duì)列是否已滿(mǎn),不滿(mǎn)就將任務(wù)存儲(chǔ)在任務(wù)隊(duì)列中,否則執(zhí)行第四步。
  4. 查看線(xiàn)程池是否已滿(mǎn),不滿(mǎn)就創(chuàng)建一條線(xiàn)程執(zhí)行任務(wù),否則就按照策略處理無(wú)法執(zhí)行的任務(wù)。

在 ThreadPoolExecutor 中表現(xiàn)為:

  • 如果當(dāng)前運(yùn)行的線(xiàn)程數(shù)小于corePoolSize,那么就創(chuàng)建線(xiàn)程來(lái)執(zhí)行任務(wù)(執(zhí)行時(shí)需要獲取全局鎖)。
  • 如果運(yùn)行的線(xiàn)程大于或等于corePoolSize,那么就把task加入BlockQueue。
  • 如果創(chuàng)建的線(xiàn)程數(shù)量大于BlockQueue的最大容量,那么創(chuàng)建新線(xiàn)程來(lái)執(zhí)行該任務(wù)。
  • 如果創(chuàng)建線(xiàn)程導(dǎo)致當(dāng)前運(yùn)行的線(xiàn)程數(shù)超過(guò)maximumPoolSize,就根據(jù)飽和策略來(lái)拒絕該任務(wù)。

三、關(guān)閉線(xiàn)程池

調(diào)用shutdown或者shutdownNow,兩者都不會(huì)接受新的任務(wù),而且通過(guò)調(diào)用要停止線(xiàn)程的interrupt方法來(lái)中斷線(xiàn)程,有可能線(xiàn)程永遠(yuǎn)不會(huì)被中斷,不同之處在于shutdownNow會(huì)首先將線(xiàn)程池的狀態(tài)設(shè)置為STOP,然后嘗試停止所有線(xiàn)程(有可能導(dǎo)致部分任務(wù)沒(méi)有執(zhí)行完)然后返回未執(zhí)行任務(wù)的列表。而shutdown則只是將線(xiàn)程池的狀態(tài)設(shè)置為shutdown,然后中斷所有沒(méi)有執(zhí)行任務(wù)的線(xiàn)程,并將剩余的任務(wù)執(zhí)行完。

四、監(jiān)控線(xiàn)程池狀態(tài)

常用狀態(tài):

  • taskCount:線(xiàn)程需要執(zhí)行的任務(wù)個(gè)數(shù)。
  • completedTaskCount:線(xiàn)程池在運(yùn)行過(guò)程中已完成的任務(wù)數(shù)。
  • largestPoolSize:線(xiàn)程池曾經(jīng)創(chuàng)建過(guò)的最大線(xiàn)程數(shù)量。
  • getPoolSize獲取當(dāng)前線(xiàn)程池的線(xiàn)程數(shù)量。
  • getActiveCount:獲取活動(dòng)的線(xiàn)程的數(shù)量

通過(guò)繼承線(xiàn)程池,重寫(xiě)beforeExecute,afterExecute 和 terminated 方法來(lái)在線(xiàn)程執(zhí)行任務(wù)前,線(xiàn)程執(zhí)行任務(wù)結(jié)束,和線(xiàn)程終結(jié)前獲取線(xiàn)程的運(yùn)行情況,根據(jù)具體情況調(diào)整線(xiàn)程池的線(xiàn)程數(shù)量。

五、實(shí)戰(zhàn)

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestApplication.class)
public class TestApplicationTests {
    // 注入ThreadPoolTaskExecutor
    @Resource
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
    @Test
    public void ThreadTest(){
        System.out.println(threadPoolTaskExecutor);
        System.out.println("new Runnable()");
        // 創(chuàng)建并執(zhí)行線(xiàn)程,方式一
        threadPoolTaskExecutor.execute(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    System.out.println("new Runnable()"+i+"當(dāng)前線(xiàn)程"+Thread.currentThread().getName());
                }
            }
        });
        // // 創(chuàng)建并執(zhí)行線(xiàn)程,方式二
        System.out.println("lambda");
        threadPoolTaskExecutor.execute(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println("lambda"+i+"當(dāng)前線(xiàn)程"+Thread.currentThread().getName());
            }
        });
    }
}

運(yùn)行截圖:

用lambda表達(dá)式實(shí)現(xiàn)Runnable

我開(kāi)始使用Java 8時(shí),首先做的就是使用lambda表達(dá)式替換匿名類(lèi),而實(shí)現(xiàn)Runnable接口是匿名類(lèi)的最好示例。

看一下Java 8之前的runnable實(shí)現(xiàn)方法,需要4行代碼,而使用lambda表達(dá)式只需要一行代碼。我們?cè)谶@里做了什么呢?那就是用() -> {}代碼塊替代了整個(gè)匿名類(lèi)。

// Java 8之前:
new Thread(new Runnable() {
 @Override
 public void run() {
 System.out.println("Before Java8, too much code for too little to do");
 }
}).start();
//Java 8方式:
new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();

到此這篇關(guān)于Spring中的ThreadPoolTaskExecutor線(xiàn)程池使用詳解的文章就介紹到這了,更多相關(guān)ThreadPoolTaskExecutor線(xiàn)程池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java 多態(tài)實(shí)例代碼

    java 多態(tài)實(shí)例代碼

    這篇文章主要介紹了java 多態(tài)實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • SpringBoot啟動(dòng)慢的優(yōu)化指南

    SpringBoot啟動(dòng)慢的優(yōu)化指南

    本摘要基于視頻畫(huà)面字幕與關(guān)鍵幀整理,視頻主題是 Spring Boot 應(yīng)用啟動(dòng)耗時(shí)優(yōu)化,核心觀(guān)點(diǎn)是:不要一上來(lái)盲目加內(nèi)存、換 SSD、改啟動(dòng)參數(shù),而是先用工具定位啟動(dòng)鏈路中真正耗時(shí)的階段,再針對(duì)性?xún)?yōu)化,需要的朋友可以參考下
    2026-06-06
  • Java中ThreadLocal的使用

    Java中ThreadLocal的使用

    這篇文章主要介紹了Java中ThreadLocal的使用,靜態(tài)內(nèi)部類(lèi)的加載是在程序中調(diào)用靜態(tài)內(nèi)部類(lèi)的時(shí)候加載的,和外部類(lèi)的加載沒(méi)有必然關(guān)系, 但是在加載靜態(tài)內(nèi)部類(lèi)的時(shí)候 發(fā)現(xiàn)外部類(lèi)還沒(méi)有加載,那么就會(huì)先加載外部類(lèi) ,加載完外部類(lèi)之后,再加載靜態(tài)內(nèi)部類(lèi),需要的朋友可以參考下
    2023-09-09
  • Intellij IDEA集成JProfiler性能分析工具

    Intellij IDEA集成JProfiler性能分析工具

    作為Java程序員,性能分析是我們必須掌握的技能之一,在性能分析中,JProfiler是一款非常強(qiáng)大的工具,本文就來(lái)介紹一下Intellij IDEA集成JProfiler性能分析工具,就有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Jmeter環(huán)境搭建及安裝步驟

    Jmeter環(huán)境搭建及安裝步驟

    Jmeter是純Java開(kāi)發(fā)的,能夠運(yùn)行Java程序的系統(tǒng)一般都可以運(yùn)行Jmeter,本文以windows下安裝步驟為例分步驟給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • Java中定時(shí)器Timer和TimerTask使用方法全解析

    Java中定時(shí)器Timer和TimerTask使用方法全解析

    這篇文章主要介紹了Java中定時(shí)器Timer和TimerTask使用方法的相關(guān)資料,如何創(chuàng)建定時(shí)任務(wù)、安排任務(wù)執(zhí)行、取消任務(wù)以及實(shí)現(xiàn)任務(wù)的暫停和恢復(fù)功能,通過(guò)這些功能,可以靈活地控制任務(wù)的執(zhí)行,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • JVM的垃圾回收機(jī)制真是通俗易懂

    JVM的垃圾回收機(jī)制真是通俗易懂

    這篇文章主要為大家詳細(xì)介紹了JVM的垃圾回收機(jī)制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • Java圓通物流軌跡推送服務(wù)接口文檔及流程

    Java圓通物流軌跡推送服務(wù)接口文檔及流程

    這篇文章主要介紹了圓通物流軌跡推送服務(wù)接口Java文檔,主要用來(lái)接收?qǐng)A通推送的訂單狀態(tài),本文給大家分享詳細(xì)流程,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • Java中HTTP GET方法調(diào)用帶有body的問(wèn)題解決

    Java中HTTP GET方法調(diào)用帶有body的問(wèn)題解決

    這篇文章主要為大家詳細(xì)介紹了Java如何解決HTTP GET方法調(diào)用帶有body的問(wèn)題,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下
    2024-02-02
  • SpringBoot開(kāi)啟虛擬線(xiàn)程的實(shí)現(xiàn)流程

    SpringBoot開(kāi)啟虛擬線(xiàn)程的實(shí)現(xiàn)流程

    虛擬線(xiàn)程(Virtual?Thread)也稱(chēng)協(xié)程或纖程,是一種輕量級(jí)的線(xiàn)程實(shí)現(xiàn),與傳統(tǒng)的線(xiàn)程以及操作系統(tǒng)級(jí)別的線(xiàn)程(也稱(chēng)為平臺(tái)線(xiàn)程)相比,它的創(chuàng)建開(kāi)銷(xiāo)更小、資源利用率更高,本文給大家介紹了SpringBoot如何開(kāi)啟虛擬線(xiàn)程,需要的朋友可以參考下
    2024-06-06

最新評(píng)論

桑日县| 南宁市| 丰县| 谢通门县| 梓潼县| 永修县| 水城县| 阿拉善右旗| 商都县| 化州市| 泽州县| 丽水市| 南江县| 郎溪县| 晋宁县| 甘洛县| 灌南县| 漯河市| 宁国市| 晋江市| 黑山县| 盐津县| 宜宾市| 开封市| 婺源县| 长海县| 离岛区| 盐边县| 昌图县| 札达县| 枞阳县| 阆中市| 岐山县| 洪洞县| 牡丹江市| 衡水市| 潮州市| 屏山县| 两当县| 鄂尔多斯市| 荥经县|