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

Java 線程池預熱(Warm-up)實戰(zhàn)

 更新時間:2026年02月11日 09:38:37   作者:Knight_AL  
本文主要介紹了Java 線程池預熱(Warm-up)實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、什么是線程池預熱?

線程池第一次執(zhí)行任務時會:

  • 創(chuàng)建核心線程
  • 加載類
  • JIT 編譯熱點方法
  • 建立資源連接(DB / Redis / RPC)

這些都需要時間,因此第一次執(zhí)行任務一般比后續(xù)慢很多

線程池預熱(warm-up)就是:

? 在系統(tǒng)啟動時提前創(chuàng)建線程
? 并讓線程執(zhí)行一次輕量任務
使其進入 已加載、已編譯、已就緒 的狀態(tài)。

二、Demo:不開啟預熱 vs 開啟預熱

我們做兩個測試:

  1. 未預熱 → 首次任務延遲明顯更高
  2. 預熱后 → 首次任務也能保持正常速度

三、測試代碼

以下代碼包含兩個方法:
testWithoutWarmUp() 未預熱
testWithWarmUp() 已預熱

完整可運行 Demo:ThreadPoolWarmUpDemo.java

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicBoolean;

public class ThreadPoolWarmUpDemo {

    public static void main(String[] args) throws Exception {
        System.out.println("========== 未開啟預熱,測試開始 ==========");
        testWithoutWarmUp();

        System.out.println("\n========== 開啟預熱后,測試開始 ==========");
        testWithWarmUp();
    }

    /** 用于模擬“第一次慢,后面快” */
    private static final AtomicBoolean firstRun = new AtomicBoolean(true);

    /** 模擬核心業(yè)務邏輯 */
    private static void mockBizWork() {
        try {
            if (firstRun.compareAndSet(true, false)) {
                // 只在第一次執(zhí)行時慢
                Thread.sleep(50);
            } else {
                // 后續(xù)任務很快
                Thread.sleep(2);
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }

    /** 創(chuàng)建一個全新的線程池(關鍵) */
    private static ThreadPoolExecutor newExecutor() {
        return new ThreadPoolExecutor(
                4, 4,
                60, TimeUnit.SECONDS,
                new LinkedBlockingQueue<>()
        );
    }

    /** 未開啟線程池預熱 */
    public static void testWithoutWarmUp() throws Exception {
        ThreadPoolExecutor executor = newExecutor();
        firstRun.set(true);

        long start = System.currentTimeMillis();

        Future<Long> future = executor.submit(() -> {
            long s = System.currentTimeMillis();
            mockBizWork();
            return System.currentTimeMillis() - s;
        });

        long firstCost = future.get();
        long totalCost = System.currentTimeMillis() - start;

        System.out.println("第一次任務耗時 = " + firstCost + " ms");
        System.out.println("整體耗時(含線程創(chuàng)建)= " + totalCost + " ms");

        executor.shutdown();
    }

    /** 開啟預熱 */
    public static void testWithWarmUp() throws Exception {
        ThreadPoolExecutor executor = newExecutor();
        firstRun.set(true);

        System.out.println(">>> 開始預熱核心線程...");
        executor.prestartAllCoreThreads();

        // 預熱任務:吃掉“第一次慢”
        for (int i = 0; i < 4; i++) {
            executor.submit(ThreadPoolWarmUpDemo::mockBizWork).get();
        }

        System.out.println(">>> 預熱完成!");

        long start = System.currentTimeMillis();

        Future<Long> future = executor.submit(() -> {
            long s = System.currentTimeMillis();
            mockBizWork();
            return System.currentTimeMillis() - s;
        });

        long cost = future.get();
        long totalCost = System.currentTimeMillis() - start;

        System.out.println("第一次任務耗時(已預熱)= " + cost + " ms");
        System.out.println("整體耗時(線程已就緒)= " + totalCost + " ms");

        executor.shutdown();
    }
}

四、對比圖(示例)

場景首次任務耗時備注
?? 未預熱55 ms包含線程創(chuàng)建、類加載等
?? 已預熱3 ms線程已創(chuàng)建、JIT 已編譯,幾乎“秒回”

五、什么時候必須使用線程池預熱?

以下場景建議開啟:

? 高并發(fā)系統(tǒng)(交易、支付、秒殺)

首個請求慢會直接影響用戶體驗和系統(tǒng)穩(wěn)定性。

? 微服務自動擴容(K8S / Spring Cloud)

Pod 剛拉起來就被流量打滿,如果沒預熱會導致:

  • 錯誤率突然增加
  • P99 延遲飆升
  • 下游熔斷

? 接口對響應時間敏感(推薦、風控、廣告)

冷啟動會影響模型推理鏈路整體延遲。

六、總結

線程池預熱很簡單,但效果極其明顯。

?? 不預熱 = 首次任務慢幾十毫秒
?? 預熱后 = 首次任務幾毫秒完成

通過:

executor.prestartAllCoreThreads();
executor.submit(warmTask);

即可大幅減少冷啟動延遲,保證服務穩(wěn)定性和低延遲能力。

到此這篇關于Java 線程池預熱(Warm-up)實戰(zhàn)的文章就介紹到這了,更多相關Java 線程池預熱內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JAVA拋出異常的三種形式詳解

    JAVA拋出異常的三種形式詳解

    這篇文章主要介紹了JAVA拋出異常的三種形式詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • java Collections 排序--多條件排序實例

    java Collections 排序--多條件排序實例

    這篇文章主要介紹了java Collections 排序--多條件排序實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java BigInteger類,BigDecimal類,Date類,DateFormat類及Calendar類用法示例

    Java BigInteger類,BigDecimal類,Date類,DateFormat類及Calendar類用法示例

    這篇文章主要介紹了Java BigInteger類,BigDecimal類,Date類,DateFormat類及Calendar類用法,結合實例形式詳細分析了Java使用BigInteger類,BigDecimal類,Date類,DateFormat類及Calendar類進行數值運算與日期運算相關操作技巧,需要的朋友可以參考下
    2019-03-03
  • mybatis插件實現自定義改寫表名實例代碼

    mybatis插件實現自定義改寫表名實例代碼

    在數據庫操作過程中,經常有修改表名的需求,下面這篇文章主要給大家介紹了關于mybatis插件實現自定義改寫表名的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • Springboot3集成Knife4j的步驟以及使用(最完整版)

    Springboot3集成Knife4j的步驟以及使用(最完整版)

    這篇文章主要介紹了Springboot3集成Knife4j的步驟以及使用的相關資料,Knife4j是一種增強Swagger的工具,支持黑色主題和更多配置選項,它與swagger-bootstrap-ui相比,提供了更現代的外觀和更多的功能,需要的朋友可以參考下
    2024-11-11
  • Java關于重排鏈表詳細解析

    Java關于重排鏈表詳細解析

    在我們平時的代碼過程中,鏈表是我們經常遇到的一個數據結構,面試題中鏈表占很大一部分,可見鏈表操作是非常重要的。本篇文章我們來探究一下如何進行重排鏈表
    2022-01-01
  • Java?Mybatis使用resultMap時,屬性賦值順序錯誤的巨坑

    Java?Mybatis使用resultMap時,屬性賦值順序錯誤的巨坑

    這篇文章主要介紹了Java?Mybatis使用resultMap時,屬性賦值順序錯誤的巨坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • MyBatis一對一級聯更新問題小結

    MyBatis一對一級聯更新問題小結

    日常工作中經常會涉及到一對一級聯更新的問題,本文主要介紹了MyBatis一對一級聯更新問題小結,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • 詳解微信開發(fā)之Author網頁授權

    詳解微信開發(fā)之Author網頁授權

    微信開發(fā)中,經常有這樣的需求:獲得用戶頭像、綁定微信號給用戶發(fā)信息,那么實現這些的前提就是授權!本文對此進行系統(tǒng)介紹,需要的朋友一起來看下吧
    2016-12-12
  • Spring Validation數據校驗詳解

    Spring Validation數據校驗詳解

    SpringValidation是Spring框架的數據校驗抽象層,支持注解、分組、嵌套校驗及國際化,默認集成HibernateValidator,可自定義校驗器滿足復雜需求,適用于Web參數校驗和業(yè)務邏輯驗證
    2025-09-09

最新評論

集贤县| 桂林市| 阜阳市| 新巴尔虎左旗| 区。| 应城市| 安阳县| 枝江市| 石渠县| 广灵县| 绥中县| 报价| 息烽县| 南和县| 南木林县| 晋中市| 沁源县| 兴海县| 湟中县| 晋宁县| 辉县市| 绿春县| 荆门市| 蒲江县| 东至县| 凤城市| 饶河县| 徐水县| 五原县| 海伦市| 晋宁县| 册亨县| 白水县| 读书| 金坛市| 延寿县| 长海县| 嘉黎县| 砚山县| 中宁县| 彭泽县|