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

Java線程池的工作機制詳解

 更新時間:2024年12月25日 09:48:39   作者:高錳酸鉀_  
本文講述了Java線程池的工作機制,包括線程池的創(chuàng)建、任務調度、線程復用、資源管理和拒絕策略,通過合理配置線程池參數(shù),可以提升系統(tǒng)的并發(fā)性能和穩(wěn)定性

Java線程池的工作機制

線程池是一種多線程管理機制,用于限制和控制并發(fā)線程的數(shù)量,以提升系統(tǒng)性能和資源利用率,降低頻繁創(chuàng)建和銷毀線程的開銷,線程池是 Java 并發(fā)編程中的重要工具之一,廣泛應用于高性能、多線程的場景

線程池通過復用已創(chuàng)建的線程執(zhí)行多個任務,避免線程的頻繁創(chuàng)建和銷毀,線程池可以限制線程數(shù)量,防止大量線程導致的系統(tǒng)資源耗盡,線程池使用隊列管理任務,支持任務調度和優(yōu)先級,線程池提供策略處理超出能力范圍的任務

我們可以使用Java提供的ThreadPoolExecutor類來創(chuàng)建一個線程池實例,讓我們先來看一下他的構造方法:

ThreadPoolExecutor(
    int corePoolSize, 
    int maximumPoolSize, 
    long keepAliveTime, 
    TimeUnit unit, 
    BlockingQueue<Runnable> workQueue, 
    ThreadFactory threadFactory, 
    RejectedExecutionHandler handler
)

可以看到他的構造方法有七個參數(shù)

  • corePoolSize:核心線程數(shù),線程池中始終保持的線程數(shù)量
  • maximumPoolSize:最大線程數(shù),線程池中允許的最大線程數(shù)量
  • keepAliveTime:空閑線程的存活時間,超過該時間的空閑線程將被回收
  • unit:時間單位,是keepAliveTime的單位
  • workQueue:任務隊列,用于存儲等待執(zhí)行的任務
  • threadFactory:線程工廠,用于創(chuàng)建新線程
  • handler:拒絕策略,用于處理超出線程池能力范圍的任務

那么為什么除了傳入一個核心線程數(shù)之外,還要傳入最大線程數(shù)呢?任務隊列中又是哪些任務在排隊等待呢?我們一起來探討一下線程池的工作機制

假設創(chuàng)建一個核心線程為2,最大線程數(shù)為4的線程池:

ThreadPoolExecutor pool = new ThreadPoolExecutor(
            2,   // 核心線程數(shù)量
            4,   // 最大線程數(shù)量
            60,  // 空閑線程最大存活時間
            TimeUnit.SECONDS, // 單位
            new ArrayBlockingQueue<>(2), //創(chuàng)建任務隊列
            Executors.defaultThreadFactory(),  // 創(chuàng)建線程工廠
            new ThreadPoolExecutor.AbortPolicy() // 任務拒絕策略
);

核心線程

如果同一時刻來了兩個任務:任務1任務2,那么自然就會把兩個任務交給兩個核心線程去執(zhí)行:

等待隊列

如果同一時刻提交了4個新的任務,但是我們定義的線程池只有兩個核心線程用來執(zhí)行任務1任務2,此時核心線程全部繁忙,新任務會被放入等待隊列,那么任務3任務4就會進入等待隊列中等待,隊列有容量限制,我們上面?zhèn)魅氲淖枞犃腥萘渴?:

臨時線程

如果同一時刻提交的任務非常多,比如提交了6個任務,那么核心線程依舊會執(zhí)行任務1任務2,由于此時核心線程全部繁忙,新任務會被放入等待隊列,任務3任務4會被放如等待隊列中等待執(zhí)行

但是將任務5放入等待隊列時,等待隊列已滿,線程池會嘗試創(chuàng)建非核心線程:臨時線程來執(zhí)行新的任務,但是核心線程與臨時線程的總和不得超過最大線程數(shù)量,也就是我們傳入的4,所以此時線程池會創(chuàng)建2個臨時線程來執(zhí)行任務5任務6

臨時線程用于處理高峰期任務,但是臨時線程并不是核心線程,當臨時線程處于空閑狀態(tài)超過 keepAliveTime 后,臨時線程就會被銷毀

任務拒絕

如果任務數(shù)量超過了線程池最大處理能力(核心線程 + 臨時線程 + 等待隊列),則執(zhí)行拒絕策略,例如同一時間提交了7個新任務,按照上面的運行機制,任務1任務2、任務5任務6會被線程執(zhí)行,任務3任務4會在等待隊列中等待空閑線程

但是由于核心線程 + 臨時線程 + 等待隊列全部滿員,此時任務7就會執(zhí)行拒絕策略,共有四種拒絕策略:

任務拒絕策略說明
ThreadPoolExecutor.AbortPolicy默認策略 丟棄任務并拋出RejectedExecutionException異常
ThreadPoolExecutor.DiscardPolicy丟棄任務,但是不拋出異常
ThreadPoolExecutor.DiscardOldestPolicy拋棄等待隊列中等待時間最久的任務,把當前任務加入等待隊列
ThreadPoolExecutor.CallerRunsPolicy調用任務的run()方法繞過線程池直接執(zhí)行

這就是線程池的工作機制,線程池通過任務復用和資源管理提升了系統(tǒng)的并發(fā)性能,但使用時需結合具體場景合理配置參數(shù),掌握線程池機制并深入理解其應用場景,將有效提升 Java 開發(fā)效率和系統(tǒng)穩(wěn)定性

那么通常在我們的項目中,線程池的容量應該設置為多大呢?

線程容量

項目中的線程容量(即線程池的大小)設置需要基于項目的類型來制定,不同的項目設置不同的容量:

CPU密集型任務

對于主要依賴CPU計算的任務(如數(shù)據處理、圖像渲染),線程數(shù)量建議接近或等于CPU核心數(shù)(包括邏輯核心)。

計算公式

這樣可以充分利用CPU,但又不會因線程上下文切換過多而導致性能下降。

I/O密集型任務

對于涉及大量I/O操作的任務(如文件讀寫、網絡請求、數(shù)據庫查詢),線程池可以設置為CPU核心數(shù)的多倍,因為I/O操作通常會讓線程處于阻塞狀態(tài)。

計算公式

更多線程可以隱藏I/O等待時間,提升系統(tǒng)吞吐量

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 深入理解Spring事務及傳播機制之原理解析與實際應用

    深入理解Spring事務及傳播機制之原理解析與實際應用

    Spring事務管理機制提供了多種傳播行為,可以控制事務的范圍和隔離級別,保證數(shù)據一致性和完整性。在實際應用中,需要根據具體業(yè)務場景選擇合適的傳播行為實現(xiàn)事務控制
    2023-04-04
  • Spring?Boot項目如何優(yōu)雅實現(xiàn)Excel導入與導出功能

    Spring?Boot項目如何優(yōu)雅實現(xiàn)Excel導入與導出功能

    在我們平時工作中經常會遇到要操作Excel的功能,比如導出個用戶信息或者訂單信息的Excel報表,下面這篇文章主要給大家介紹了關于Spring?Boot項目中如何優(yōu)雅實現(xiàn)Excel導入與導出功能的相關資料,需要的朋友可以參考下
    2022-06-06
  • 解決SpringBoot整合ElasticSearch遇到的連接問題

    解決SpringBoot整合ElasticSearch遇到的連接問題

    這篇文章主要介紹了解決SpringBoot整合ElasticSearch遇到的連接問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • springsecurity6配置自定義路徑身份認證的實現(xiàn)

    springsecurity6配置自定義路徑身份認證的實現(xiàn)

    本文主要介紹了springsecurity6配置自定義路徑身份認證的實現(xiàn),通過使用自定義的AuthorizationManager和MyService,可以實現(xiàn)更靈活的訪問控制,感興趣的可以了解一下
    2025-03-03
  • idea批量啟動多個微服務具體實現(xiàn)

    idea批量啟動多個微服務具體實現(xiàn)

    這篇文章主要給大家介紹了關于idea批量啟動多個微服務的具體實現(xiàn),在微服務開發(fā)過程中,我們經常要在本地啟動很多個微服務,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • SpringBoot中開啟GZIP壓縮的方式

    SpringBoot中開啟GZIP壓縮的方式

    這篇文章主要介紹了SpringBoot中開啟GZIP壓縮的方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • mybatis使用case when按照條件進行更新方式

    mybatis使用case when按照條件進行更新方式

    示例一通過條碼批量更新入庫和剩余數(shù)量,直接高效;示例二使用set和trim標簽,實現(xiàn)動態(tài)字段更新與條件優(yōu)化,結構更復雜但靈活性更高
    2025-07-07
  • Java 并發(fā)鎖ReentrantLock的實現(xiàn)

    Java 并發(fā)鎖ReentrantLock的實現(xiàn)

    本文主要介紹了Java 并發(fā)鎖ReentrantLock的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-04-04
  • 使用 Java 開發(fā) Gradle 插件的步驟

    使用 Java 開發(fā) Gradle 插件的步驟

    這篇文章主要介紹了使用 Java 開發(fā) Gradle 插件的步驟,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下
    2021-03-03
  • Java?Web中常見的安全漏洞的防御策略和代碼實現(xiàn)

    Java?Web中常見的安全漏洞的防御策略和代碼實現(xiàn)

    隨著互聯(lián)網的快速發(fā)展,Web應用安全問題日益突出,作為企業(yè)級應用開發(fā)的主流語言之一,Java在Web開發(fā)領域占據重要地位,本文將詳細介紹Java?Web應用中常見的安全漏洞,并提供實用的防御策略和代碼實現(xiàn),需要的朋友可以參考下
    2025-06-06

最新評論

额尔古纳市| 石楼县| 保靖县| 洪湖市| 昌吉市| 竹山县| 南雄市| 临猗县| 海丰县| 德令哈市| 宜阳县| 延津县| 衡山县| 开远市| 陆丰市| 政和县| 云安县| 南昌市| 图们市| 金山区| 饶平县| 二连浩特市| 吉首市| 云阳县| 宜春市| 建湖县| 平乡县| 青龙| 乌兰县| 蒙城县| 通辽市| 望谟县| 灵川县| 育儿| 万宁市| 琼中| 子长县| 方城县| 固原市| 缙云县| 富民县|