亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

一、什么是線程池?

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

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

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

在這里插入圖片描述

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

三、線程池的使用

線程池的創(chuàng)建

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

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

四、常用阻塞隊列

ArrayBlockingQueue

底層基于數組的實現的有界阻塞隊列

LinkedBlockingQueue

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

五、線程工廠

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

在這里插入圖片描述

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

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

六、拒絕策略

當線程池內工作線程數大于maximumPoolSize時,線程就不再接受任務,執(zhí)行對應的拒絕策略;目前支持的拒絕策略有四種:

1.AbortPolicy(默認):丟棄任務并拋出RejectedExecutionException異常

2.CallerRunsPolicy:由調用者處理

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

4.DiscardPolicy:丟棄任務但不拋出異常

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

九、執(zhí)行流程

在這里插入圖片描述

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

相關文章

  • Java實現企業(yè)員工管理系統

    Java實現企業(yè)員工管理系統

    這篇文章主要為大家詳細介紹了Java實現企業(yè)員工管理系統,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Spring中@Configuration和@Component注解的區(qū)別及原理

    Spring中@Configuration和@Component注解的區(qū)別及原理

    這篇文章主要介紹了Spring中@Configuration和@Component注解的區(qū)別及原理,從功能上來講,這些注解所負責的功能的確不相同,但是從本質上來講,Spring內部都將其作為配置注解進行處理,需要的朋友可以參考下
    2023-11-11
  • Springmvc如何實現向前臺傳遞數據

    Springmvc如何實現向前臺傳遞數據

    這篇文章主要介紹了Springmvc如何實現向前臺傳遞數據,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • MyBatisPlus之id生成策略的方法

    MyBatisPlus之id生成策略的方法

    本文主要介紹了MyBatisPlus之id生成策略的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Mybatis使用update更新值為null時不生效問題解決

    Mybatis使用update更新值為null時不生效問題解決

    這篇文章主要介紹了Mybatis使用update更新值為null時不生效問題解決,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • java開發(fā)https請求ssl不受信任問題解決方法

    java開發(fā)https請求ssl不受信任問題解決方法

    這篇文章主要介紹了java開發(fā)https請求ssl不受信任問題解決方法,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Spring 重定向(Redirect)指南及相關策略問題

    Spring 重定向(Redirect)指南及相關策略問題

    本文介紹了在Spring中實現重定向的三種不同方法,在執(zhí)行這些重定向時如何處理/傳遞屬性以及如何處理HTTP POST請求的重定向。關于Spring 重定向(Redirect)指南的相關知識大家參考下本文
    2017-11-11
  • Java matches類,Pattern類及matcher類用法示例

    Java matches類,Pattern類及matcher類用法示例

    這篇文章主要介紹了Java matches類,Pattern類及matcher類用法,結合實例形式分析了java matches類,Pattern類及matcher類針對字符串常見操作技巧與相關注意事項,需要的朋友可以參考下
    2019-03-03
  • jdk15的安裝與配置全過程記錄

    jdk15的安裝與配置全過程記錄

    這篇文章主要給大家介紹了關于jdk15的安裝與配置,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Spring?Boot常用的參數驗證技巧和使用方法

    Spring?Boot常用的參數驗證技巧和使用方法

    Spring Boot是一個使用Java編寫的開源框架,用于快速構建基于Spring的應用程序,這篇文章主要介紹了Spring?Boot常用的參數驗證技巧和使用方法,需要的朋友可以參考下
    2023-09-09

最新評論