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

Java 線程池核心參數(shù)、執(zhí)行流程與實戰(zhàn)建議全解析

 更新時間:2025年04月22日 10:11:03   作者:扶風(fēng)_w  
主要介紹了 Java 線程池:核心參數(shù)、執(zhí)行流程與實戰(zhàn)建議,我將用最通俗的方式帶你搞懂 Java 線程池,從構(gòu)造函數(shù)開始,講透執(zhí)行機制、參數(shù)配置,再結(jié)合我在真實項目中的使用經(jīng)驗,總結(jié)出一套實戰(zhàn)建議,需要的朋友可以參考下

在 Java 后端開發(fā)中,線程池 是個“看起來簡單,用起來復(fù)雜”的工具。你可能已經(jīng)在項目中用過 @AsyncExecutors.newFixedThreadPool() 或者自己 new 一個 ThreadPoolExecutor。但你是否真的理解線程池的工作原理?它背后的執(zhí)行流程?又該如何避免那些隱藏的坑?

這篇文章,我將用最通俗的方式帶你搞懂 Java 線程池,從構(gòu)造函數(shù)開始,講透執(zhí)行機制、參數(shù)配置,再結(jié)合我在真實項目中的使用經(jīng)驗,總結(jié)出一套實戰(zhàn)建議。

一、為什么需要線程池?

Java 中創(chuàng)建一個新線程是相當(dāng)“昂貴”的操作:

  • 每創(chuàng)建一個線程就意味著新的內(nèi)存棧空間、調(diào)度開銷;
  • 創(chuàng)建頻繁還可能導(dǎo)致系統(tǒng)資源耗盡(尤其是高并發(fā)場景);

使用線程池能帶來的好處:

  • ? 降低資源消耗(復(fù)用已創(chuàng)建線程);
  • ? 提高響應(yīng)速度(任務(wù)無需等待創(chuàng)建線程);
  • ? 統(tǒng)一管理線程行為(可控的隊列長度、最大線程數(shù)、異常捕獲等);

所以 —— 不管你是做 Web、爬蟲、數(shù)據(jù)處理還是異步任務(wù),線程池都值得你精通。

二、ThreadPoolExecutor 構(gòu)造函數(shù)詳解

Java 提供了一個核心類:ThreadPoolExecutor,它是所有線程池實現(xiàn)的基礎(chǔ)。它的構(gòu)造函數(shù)如下:

public ThreadPoolExecutor(
    int corePoolSize, // 核心線程數(shù)
    int maximumPoolSize, // 最大線程數(shù)
    long keepAliveTime, // 線程存活時間
    TimeUnit unit, // 時間單位
    BlockingQueue<Runnable> workQueue, // 隊列
    ThreadFactory threadFactory, // 線程工廠
    RejectedExecutionHandler handler // 拒絕策略
)

看起來很多參數(shù)?別怕,我們一個個講。 

參數(shù)含義推薦配置思路
corePoolSize核心線程數(shù)一般為 CPU 核數(shù) 或 稍高
maximumPoolSize最大線程數(shù)比 corePoolSize 稍高,用于應(yīng)急突發(fā)流量
keepAliveTime + unit非核心線程存活時間通常設(shè)為 60 秒
workQueue任務(wù)等待隊列推薦使用有界隊列(避免 OOM)
threadFactory線程工廠自定義線程名,方便定位問題
handler拒絕策略看業(yè)務(wù)選,一般用 CallerRuns 或 自定義

三、線程池任務(wù)執(zhí)行流程圖

整個線程池處理流程大致如下:

  • 當(dāng)任務(wù)進來時,如果當(dāng)前運行的線程數(shù) < corePoolSize,就新建線程執(zhí)行任務(wù)
  • 否則判斷隊列是否滿,如果隊列沒滿,就放入隊列排隊
  • 如果隊列滿了,并且線程數(shù) < maximumPoolSize,就新建線程執(zhí)行任務(wù);
  • 如果線程數(shù)也達到最大了,那就執(zhí)行拒絕策略。

你可以理解為三道門檻:核心線程數(shù) -> 隊列容量 -> 最大線程數(shù)。

四、常見拒絕策略(你一定要掌握)

策略名行為是否推薦
AbortPolicy直接拋出異常? 有風(fēng)險(默認)
CallerRunsPolicy由調(diào)用者線程執(zhí)行任務(wù)? 穩(wěn)妥,節(jié)流
DiscardPolicy直接丟棄任務(wù)? 極端
DiscardOldestPolicy丟棄最早排隊任務(wù)?? 業(yè)務(wù)非重要時可用

五、實戰(zhàn)配置案例

下面是一個我在真實項目中使用過的線程池配置:

public class ThreadPoolUtil {
    public static ExecutorService getExecutor() {
        return new ThreadPoolExecutor(
            4, 10,
            60, TimeUnit.SECONDS,
            new LinkedBlockingQueue<>(1000),
            new NamedThreadFactory("order-processor"),
            new ThreadPoolExecutor.CallerRunsPolicy()
        );
    }
}

?? 為什么這么配置?

  • 核心線程4個:適合 4核CPU;
  • 最大10個:預(yù)留處理突發(fā)任務(wù);
  • 隊列1000:合理緩存任務(wù),避免頻繁 reject;
  • 線程命名:方便日志中查問題;
  • CallerRuns策略:觸頂時交給主線程,自動限流;

六、那些你可能忽略的坑

  • 不關(guān)閉線程池:使用完后不調(diào)用 shutdown(),可能導(dǎo)致程序無法正常退出。
  • 濫用 Executors 工具類:如 newFixedThreadPool() 使用無界隊列,newCachedThreadPool() 最大線程數(shù)過大,容易內(nèi)存溢出。建議使用 ThreadPoolExecutor 明確指定參數(shù)。
  • 誤用 submit()submit() 返回 Future,即使任務(wù)出錯也不會拋異常,必須通過 get() 才能發(fā)現(xiàn)。若無需返回結(jié)果,推薦使用 execute()。

七、最佳實踐總結(jié)

? 使用有界隊列,控制資源使用
? 命名線程,方便排查日志問題
? 合理配置 core 和 max,大膽使用 CPU 核數(shù)
? 拒絕策略慎選,推薦 CallerRuns
? 封裝線程池為工具類,便于復(fù)用
? 定期監(jiān)控線程池狀態(tài)(線程數(shù)、隊列長度)

?? 寫在最后

線程池是一個非常核心的基礎(chǔ)組件,很多系統(tǒng)的性能瓶頸、并發(fā)問題、甚至線上事故,都可能跟線程池配置有關(guān)。

如果你看完本文,能:

  • 搞清楚線程池的構(gòu)造邏輯
  • 能正確配置線程池參數(shù)
  • 避免常見的使用坑

那么我覺得這篇文章的目的就達到了。

到此這篇關(guān)于 Java 線程池:核心參數(shù)、執(zhí)行流程與實戰(zhàn)建議的文章就介紹到這了,更多相關(guān)java線程池核心參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 全面了解java異常

    全面了解java異常

    本文非常詳細的介紹了java異常,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們可以學(xué)習(xí)一下這篇文章
    2021-08-08
  • SpringMVC框架和SpringBoot項目中控制器的響應(yīng)結(jié)果深入分析

    SpringMVC框架和SpringBoot項目中控制器的響應(yīng)結(jié)果深入分析

    這篇文章主要介紹了SpringMVC框架和SpringBoot項目中控制器的響應(yīng)結(jié)果,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-12-12
  • 踩坑之spring事務(wù),非事務(wù)方法與事務(wù)方法執(zhí)行相互調(diào)用方式

    踩坑之spring事務(wù),非事務(wù)方法與事務(wù)方法執(zhí)行相互調(diào)用方式

    這篇文章主要介紹了踩坑之spring事務(wù),非事務(wù)方法與事務(wù)方法執(zhí)行相互調(diào)用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringMVC中RequestContextHolder獲取請求信息的方法

    SpringMVC中RequestContextHolder獲取請求信息的方法

    這篇文章主要介紹了SpringMVC中RequestContextHolder獲取請求信息的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 非常實用的java自動答題計時計分器

    非常實用的java自動答題計時計分器

    這篇文章主要為大家詳細介紹了非常實用的java自動答題計時計分器的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Spring 中jdbcTemplate 實現(xiàn)執(zhí)行多條sql語句示例

    Spring 中jdbcTemplate 實現(xiàn)執(zhí)行多條sql語句示例

    本篇文章主要介紹了Spring 中jdbcTemplate 實現(xiàn)執(zhí)行多條sql語句示例,可以對多個表執(zhí)行多個sql語句,有興趣的可以了解一下。
    2017-01-01
  • JAVA中的Token 基于Token的身份驗證實例

    JAVA中的Token 基于Token的身份驗證實例

    這篇文章主要介紹了JAVA中的Token 基于Token的身份驗證實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java堆&優(yōu)先級隊列示例講解(上)

    Java堆&優(yōu)先級隊列示例講解(上)

    這篇文章主要通過示例詳細為大家介紹Java中的堆以及優(yōu)先級隊列,文中的示例代碼講解詳細,對我們了解java有一定幫助,需要的可以參考一下
    2022-03-03
  • idea啟動spring項目中文亂碼的解決方法

    idea啟動spring項目中文亂碼的解決方法

    本文主要介紹了idea啟動spring項目中文亂碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Kotlin lateinit與by lazy案例詳解

    Kotlin lateinit與by lazy案例詳解

    這篇文章主要介紹了Kotlin lateinit與by lazy案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09

最新評論

民勤县| 安乡县| 西乌珠穆沁旗| 山丹县| 左权县| 灵石县| 晋江市| 广东省| 两当县| 南和县| 江口县| 宁陵县| 浏阳市| 墨玉县| 城步| 山西省| 新竹县| 明星| 渭源县| 潮州市| 岑溪市| 任丘市| 习水县| 宜春市| 会宁县| 宁陵县| 富川| 隆子县| 广东省| 且末县| 石泉县| 新宁县| 广饶县| 阿拉尔市| 元阳县| 昌图县| 鹿邑县| 黄陵县| 阳高县| 金寨县| 东乡族自治县|