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

Java中的ThreadPoolExecutor線程池原理細(xì)節(jié)解析

 更新時(shí)間:2023年12月27日 10:35:08   作者:笑我歸無處  
這篇文章主要介紹了Java中的ThreadPoolExecutor線程池原理細(xì)節(jié)解析,ThreadPoolExecutor是一個(gè)線程池,最多可使用7個(gè)參數(shù)來控制線程池的生成,使用線程池可以避免創(chuàng)建和銷毀線程的資源損耗,提高響應(yīng)速度,并且可以管理線程池中線程的數(shù)量和狀態(tài)等等,需要的朋友可以參考下

一、什么是ThreadPoolExecutor

ThreadPoolExecutor是一個(gè)線程池,最多可使用7個(gè)參數(shù)來控制線程池的生成。 使用線程池可以避免創(chuàng)建和銷毀線程的資源損耗,提高響應(yīng)速度,并且可以管理線程池中線程的數(shù)量和狀態(tài)等等。 阿里巴巴手冊(cè)中也推薦使用該線程池,因?yàn)镋xecutors創(chuàng)建緩存線程池時(shí),最大線程數(shù)是Integer.MAX_VALUE,可能導(dǎo)致堆棧溢出。而且使用ThreadPoolExecutor創(chuàng)建線程池可以讓開發(fā)者更好理解線程池原理。

二、使用線程池的優(yōu)點(diǎn)

1.減少系統(tǒng)資源消耗

無須重復(fù)創(chuàng)建和銷毀線程,減少了線程創(chuàng)建和銷毀造成的資源消耗。

2.提高響應(yīng)速度

創(chuàng)建好的線程會(huì)駐留在線程池中,無需創(chuàng)建新線程執(zhí)行任務(wù),因而提高了響應(yīng)速度。

3.提高了線程的可管理性。

線程池可以控制線程的數(shù)量,可以選擇拒絕策略,可以監(jiān)控和管理線程的狀態(tài),控制并發(fā)量等等。 這些都是自己創(chuàng)建線程難以做到的。

三、線程池原理

3.1 線程池的7個(gè)參數(shù)

1)corePoolSize 核心線程數(shù)

線程池常駐線程數(shù)量

2)maximumPoolSize 最大線程數(shù)

最大可存在的線程數(shù)量

3)keepAliveTime 非核心線程的存活時(shí)間

非核心線程空閑時(shí),可以停留的時(shí)間

4)unit 存活時(shí)間的單位

非核心線程空閑時(shí),可以停留的時(shí)間的單位

5)workQueue 阻塞隊(duì)列

線程都在使用中時(shí),可以將任務(wù)保存在阻塞隊(duì)列中,可以設(shè)置隊(duì)列的長(zhǎng)度。

6)threadFactory 線程創(chuàng)建工廠

可以選擇創(chuàng)建線程的工廠

7)handler 拒絕策略

當(dāng)線程池?zé)o法存放更多任務(wù)時(shí),處理這些過多的任務(wù)的策略

3.2 線程池執(zhí)行任務(wù)的流程

public void execute(Runnable command) {
    if (command == null)
        throw new NullPointerException();
    int c = ctl.get();
    //判斷工作線程數(shù)是否小于核心線程數(shù)
    if (workerCountOf(c) < corePoolSize) {
    	//是,創(chuàng)建一個(gè)新線程
        if (addWorker(command, true))
            return;
        c = ctl.get();
    }
    //否,將任務(wù)嘗試添加到阻塞隊(duì)列中,如果隊(duì)列滿了則會(huì)添加失敗。
    if (isRunning(c) && workQueue.offer(command)) {
        int recheck = ctl.get();
        //判斷線程池狀態(tài)是否在運(yùn)行中,不在運(yùn)行中時(shí),刪除該任務(wù)
        if (! isRunning(recheck) && remove(command))
        	//不在運(yùn)行中時(shí),執(zhí)行拒絕策略
            reject(command);
        //判斷工作線程數(shù)是否為0
        else if (workerCountOf(recheck) == 0)
        	//為0的場(chǎng)合,嘗試創(chuàng)建新線程
            addWorker(null, false);
    }
    //添加失敗的場(chǎng)合,嘗試創(chuàng)建一個(gè)新線程
    else if (!addWorker(command, false))
    	//如果添加失敗,執(zhí)行拒絕策略
        reject(command);
}
  1. 當(dāng)執(zhí)行一個(gè)任務(wù)時(shí),首先會(huì)判斷工作線程數(shù)是否小于核心線程數(shù)。
    • 如果小于核心線程數(shù),則創(chuàng)建一個(gè)新線程來執(zhí)行該任務(wù)。執(zhí)行完畢。
  2. 如果大于核心線程數(shù),則嘗試將任務(wù)放入阻塞隊(duì)列中。
    • 如果成功放入阻塞隊(duì)列,待有空閑的線程時(shí),空閑線程會(huì)從阻塞隊(duì)列中獲取任務(wù)并執(zhí)行。執(zhí)行完畢。
  3. 如果放入失敗,表示阻塞隊(duì)列已滿,此時(shí)會(huì)嘗試創(chuàng)建一個(gè)新線程來執(zhí)行該任務(wù)。
    • 如果當(dāng)前線程數(shù)小于最大線程數(shù),則會(huì)創(chuàng)建新線程來執(zhí)行該任務(wù)。執(zhí)行完畢。
    • 如果工作線程數(shù)等于最大線程數(shù),則不會(huì)創(chuàng)建新線程,嘗試創(chuàng)建失敗。此時(shí)會(huì)執(zhí)行拒絕策略。執(zhí)行完畢。

四、Executors提供的常用線程池

4.1 Executors.newFixedThreadPool

一個(gè)固定數(shù)量的線程池,可以通過傳入的參數(shù)int nThreads來控制線程池的線程數(shù)量。(核心線程數(shù)和最大線程數(shù)相同)

public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

4.2 Executors.newSingleThreadExecutor

一個(gè)線程數(shù)只有1的線程池??梢员WC任務(wù)的順序執(zhí)行。

public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

4.3 Executors.newCachedThreadPool

緩存線程池,新創(chuàng)建的線程會(huì)在該線程池中緩存60秒。可以提高短期異步任務(wù)的性能。 注意,最大線程數(shù)是Integer.MAX_VALUE,高并發(fā)的場(chǎng)合下,可能會(huì)創(chuàng)建大量線程。

public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }

4.4 Executors.newScheduledThreadPool

定時(shí)任務(wù)線程池,使用該線程池可以定時(shí)執(zhí)行任務(wù)。

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }

到此這篇關(guān)于Java中的ThreadPoolExecutor線程池原理細(xì)節(jié)解析的文章就介紹到這了,更多相關(guān)ThreadPoolExecutor線程池原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • EasyExcel動(dòng)態(tài)表頭基礎(chǔ)用法及最佳實(shí)踐詳解

    EasyExcel動(dòng)態(tài)表頭基礎(chǔ)用法及最佳實(shí)踐詳解

    EasyExcel是阿里巴巴開源的一個(gè)基于Java的簡(jiǎn)單、省內(nèi)存的讀寫Excel工具,在處理大量數(shù)據(jù)時(shí),它能極大地減少內(nèi)存占用提高性能,這篇文章主要介紹了EasyExcel動(dòng)態(tài)表頭基礎(chǔ)用法及最佳實(shí)踐的相關(guān)資料,需要的朋友可以參考下
    2026-03-03
  • Java AQS的實(shí)現(xiàn)原理詳解

    Java AQS的實(shí)現(xiàn)原理詳解

    這篇文章主要借助了ReentrantLock來帶大家搞清楚AQS的實(shí)現(xiàn)原理,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-04-04
  • IDEA調(diào)試功能使用總結(jié)(step?over/step?into/force?step?into/step?out)

    IDEA調(diào)試功能使用總結(jié)(step?over/step?into/force?step?into/step?o

    本文主要介紹了IDEA調(diào)試功能使用總結(jié)(step?over/step?into/force?step?into/step?out),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • JavaWeb表單注冊(cè)界面的實(shí)現(xiàn)方法

    JavaWeb表單注冊(cè)界面的實(shí)現(xiàn)方法

    這篇文章主要介紹了JavaWeb表單注冊(cè)界面的實(shí)現(xiàn)方法的相關(guān)資料,希望通過本文大家能掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-09-09
  • Spring boot整合Mybatis-plus過程解析

    Spring boot整合Mybatis-plus過程解析

    這篇文章主要介紹了Spring boot整合Mybatis-plus過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • java 通過 SmbFile 類操作共享文件夾的示例

    java 通過 SmbFile 類操作共享文件夾的示例

    這篇文章主要介紹了java 通過 SmbFile 類操作共享文件夾,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • pagehelper分頁工具類的封裝

    pagehelper分頁工具類的封裝

    這篇文章主要為大家詳細(xì)介紹了pagehelper分頁工具類的封裝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • java 實(shí)現(xiàn)web項(xiàng)目啟動(dòng)加載properties屬性文件

    java 實(shí)現(xiàn)web項(xiàng)目啟動(dòng)加載properties屬性文件

    這篇文章主要介紹了java 實(shí)現(xiàn)web項(xiàng)目啟動(dòng)加載properties屬性文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • JAVA 多態(tài)操作----父類與子類轉(zhuǎn)換問題實(shí)例分析

    JAVA 多態(tài)操作----父類與子類轉(zhuǎn)換問題實(shí)例分析

    這篇文章主要介紹了JAVA 多態(tài)操作----父類與子類轉(zhuǎn)換問題,結(jié)合實(shí)例形式分析了JAVA 多態(tài)操作中父類與子類轉(zhuǎn)換問題相關(guān)原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • Java實(shí)現(xiàn)grpc框架的示例

    Java實(shí)現(xiàn)grpc框架的示例

    本文主要介紹了gRPC框架及其與ProtocolBuffers的結(jié)合,用于構(gòu)建分布式系統(tǒng),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-09-09

最新評(píng)論

台中市| 聂拉木县| 石河子市| 政和县| 金秀| 澄迈县| 苏州市| 新丰县| 平凉市| 山阳县| 南靖县| 元氏县| 汝阳县| 甘德县| 洛浦县| 阆中市| 印江| 栖霞市| 铜山县| 岳普湖县| 镇江市| 特克斯县| 乌兰察布市| 信丰县| 太白县| 德江县| 莱西市| 南昌市| 塔城市| 繁昌县| 林州市| 康平县| 新邵县| 大英县| 筠连县| 钟山县| 淮阳县| 顺义区| 宁夏| 中阳县| 新兴县|