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

詳解Java線程池的使用及工作原理

 更新時間:2021年05月28日 16:30:27   作者:小海子l  
在日常開發(fā)過程中總是以單線程的思維去編碼,沒有考慮到在多線程狀態(tài)下的運行狀況.由此引發(fā)的結(jié)果就是請求過多,應(yīng)用無法響應(yīng).為了解決請求過多的問題,又衍生出了線程池的概念.本文記錄了Java中線程池的使用及工作原理,需要的朋友可以參考下

一、什么是線程池?

線程池是一種用于實現(xiàn)計算機程序并發(fā)執(zhí)行的軟件設(shè)計模式。線程池維護(hù)多個線程,等待由調(diào)度程序分配任務(wù)以并發(fā)執(zhí)行,該模型提高了性能,并避免了由于為短期任務(wù)頻繁創(chuàng)建和銷毀線程而導(dǎo)致的執(zhí)行延遲。

二、線程池要解決什么問題?

說到線程池就一定要從線程的生命周期講起。

在這里插入圖片描述

從圖中可以了解無論任務(wù)執(zhí)行多久,每個線程都要經(jīng)歷從生到死的狀態(tài)。而使用線程池就是為了避免線程的重復(fù)創(chuàng)建,從而節(jié)省了線程的NewRunnableRunningTerminated的時間;同時也會復(fù)用線程,最小化的節(jié)省系統(tǒng)資源,于此同時提高了響應(yīng)速度。

三、線程池的使用

線程池的創(chuàng)建

使用ThreadPoolExecutor并配置7個參數(shù)完成線程池的創(chuàng)建

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)
  • corePoolSize:線程池中核心線程的最大值
  • maximumPoolSize:線程池中最大線程數(shù)
  • keepAliveTime:非核心線程空閑的存活時間大小
  • unit:keepAliveTime的單位,常用的有秒、分鐘、小時等
  • workQueue:阻塞隊列類型
  • threadFactory:線程工廠,用于配置線程的名稱,是否為守護(hù)線程等
  • handler:線程池的拒絕策略

四、常用阻塞隊列

ArrayBlockingQueue

底層基于數(shù)組的實現(xiàn)的有界阻塞隊列

LinkedBlockingQueue

底層基于單鏈表的阻塞隊列,可配置容量,不配置容量默認(rèn)為Integer.MAX_VALUE

五、線程工廠

《阿里巴巴Java開發(fā)手冊》中強制要求指定線程的名稱

在這里插入圖片描述

由于工作是使用hutool比較多,里面也包含對ThreadFactory的封裝,可以很方便的指定名稱

ThreadFactory threadFactory = ThreadFactoryBuilder.create().setNamePrefix("myThread-").build();

六、拒絕策略

當(dāng)線程池內(nèi)工作線程數(shù)大于maximumPoolSize時,線程就不再接受任務(wù),執(zhí)行對應(yīng)的拒絕策略;目前支持的拒絕策略有四種:

1.AbortPolicy(默認(rèn)):丟棄任務(wù)并拋出RejectedExecutionException異常

2.CallerRunsPolicy:由調(diào)用者處理

3.DiscardOldestPolicy:丟棄隊列中最前面的任務(wù),并重新入隊列

4.DiscardPolicy:丟棄任務(wù)但不拋出異常

七、線程池的執(zhí)行邏輯

// 創(chuàng)建線程工廠
ThreadFactory threadFactory = ThreadFactoryBuilder.create().setNamePrefix("myThread-").build();
// 創(chuàng)建線程池
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100), threadFactory, new ThreadPoolExecutor.AbortPolicy());

八、execute()方法

// 組合值;保存了線程池的工作狀態(tài)和工作線程數(shù)
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
public void execute(Runnable command) {
    	// 任務(wù)為空 拋出NPE
        if (command == null)
            throw new NullPointerException();
        // 獲取線程池狀態(tài)
        int c = ctl.get();
        // 如果工作線程數(shù)小于核心線程數(shù)就創(chuàng)建新線程
        if (workerCountOf(c) < corePoolSize) {
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }
        // 如果線程池處于Running狀態(tài),就把任務(wù)放在隊列尾部
        if (isRunning(c) && workQueue.offer(command)) {
            // 重新檢查線程池狀態(tài)
            int recheck = ctl.get();
            // 如果線程池不是Running狀態(tài),就移除剛才添加的任務(wù),并執(zhí)行拒絕策略
            if (! isRunning(recheck) && remove(command))
                reject(command);
            // 是Running狀態(tài),就添加線程
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        // 添加任務(wù)失敗,執(zhí)行拒絕策略
        else if (!addWorker(command, false))
            reject(command);
    }
// addWorker()完成線程的創(chuàng)建

九、執(zhí)行流程

在這里插入圖片描述

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

相關(guān)文章

  • mybatis mapper.xml獲取insert后的自增ID問題

    mybatis mapper.xml獲取insert后的自增ID問題

    這篇文章主要介紹了mybatis mapper.xml獲取insert后的自增ID問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java之BigDecimal實現(xiàn)詳解

    Java之BigDecimal實現(xiàn)詳解

    這篇文章主要介紹了Java之BigDecimal實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java 如何繞過迭代器遍歷時的數(shù)據(jù)修改異常

    Java 如何繞過迭代器遍歷時的數(shù)據(jù)修改異常

    這篇文章主要介紹了Java 繞過迭代器遍歷時的數(shù)據(jù)修改異常的方法,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-02-02
  • SpringBoot整合Xxl-Job的完整步驟記錄

    SpringBoot整合Xxl-Job的完整步驟記錄

    這篇文章主要給大家介紹了關(guān)于SpringBoot整合Xxl-Job的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • idea類名顯示多行的設(shè)置方式

    idea類名顯示多行的設(shè)置方式

    在IntelliJ IDEA中,類名的顯示方式可以通過設(shè)置來調(diào)整,若想設(shè)置為單行顯示,需在設(shè)置中找到相關(guān)選項并勾選“√”,若需多行顯示,則取消勾選即可,此操作有助于優(yōu)化代碼視圖,提升開發(fā)效率
    2024-09-09
  • 詳解SpringBoot Redis自適應(yīng)配置(Cluster Standalone Sentinel)

    詳解SpringBoot Redis自適應(yīng)配置(Cluster Standalone Sentinel)

    這篇文章主要介紹了詳解SpringBoot Redis自適應(yīng)配置(Cluster Standalone Sentinel),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java畢業(yè)設(shè)計實戰(zhàn)之財務(wù)預(yù)算管理系統(tǒng)的實現(xiàn)

    Java畢業(yè)設(shè)計實戰(zhàn)之財務(wù)預(yù)算管理系統(tǒng)的實現(xiàn)

    這是一個使用了java+SSM+Jsp+Mysql+Layui+Maven開發(fā)的財務(wù)預(yù)算管理系統(tǒng),是一個畢業(yè)設(shè)計的實戰(zhàn)練習(xí),具有財務(wù)預(yù)算管理該有的所有功能,感興趣的朋友快來看看吧
    2022-02-02
  • Spring條件注解@Conditional示例詳解

    Spring條件注解@Conditional示例詳解

    這篇文章主要給大家介紹了關(guān)于Spring條件注解@Conditional的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 基于Mybatis-plus實現(xiàn)多租戶架構(gòu)的全過程

    基于Mybatis-plus實現(xiàn)多租戶架構(gòu)的全過程

    多租戶是一種軟件架構(gòu)技術(shù),在多用戶的環(huán)境下,共有同一套系統(tǒng),并且要注意數(shù)據(jù)之間的隔離性,下面這篇文章主要給大家介紹了關(guān)于基于Mybatis-plus實現(xiàn)多租戶架構(gòu)的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • 深入了解Java核心類庫--Arrays類

    深入了解Java核心類庫--Arrays類

    這篇文章主要為大家詳細(xì)介紹了java Arrays類定義與使用的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-07-07

最新評論

游戏| 黔西| 丁青县| 囊谦县| 衡山县| 乐东| 辽阳县| 滕州市| 元阳县| 安国市| 东辽县| 万山特区| 方山县| 五大连池市| 甘德县| 芷江| 泉州市| 龙口市| 灌云县| 饶平县| 疏勒县| 清徐县| 泽普县| 彝良县| 英德市| 加查县| 岳池县| 海阳市| 阳曲县| 大姚县| 安丘市| 襄垣县| 浦县| 华容县| 阳朔县| 自治县| 晴隆县| 昆山市| 镇赉县| 堆龙德庆县| 墨竹工卡县|