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

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

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

一、什么是線程池預(yù)熱?

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

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

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

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

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

二、Demo:不開啟預(yù)熱 vs 開啟預(yù)熱

我們做兩個測試:

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

三、測試代碼

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

完整可運行 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("========== 未開啟預(yù)熱,測試開始 ==========");
        testWithoutWarmUp();

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

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

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

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

    /** 未開啟線程池預(yù)熱 */
    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("第一次任務(wù)耗時 = " + firstCost + " ms");
        System.out.println("整體耗時(含線程創(chuàng)建)= " + totalCost + " ms");

        executor.shutdown();
    }

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

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

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

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

        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("第一次任務(wù)耗時(已預(yù)熱)= " + cost + " ms");
        System.out.println("整體耗時(線程已就緒)= " + totalCost + " ms");

        executor.shutdown();
    }
}

四、對比圖(示例)

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

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

以下場景建議開啟:

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

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

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

Pod 剛拉起來就被流量打滿,如果沒預(yù)熱會導(dǎo)致:

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

? 接口對響應(yīng)時間敏感(推薦、風(fēng)控、廣告)

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

六、總結(jié)

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

?? 不預(yù)熱 = 首次任務(wù)慢幾十毫秒
?? 預(yù)熱后 = 首次任務(wù)幾毫秒完成

通過:

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

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

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

相關(guān)文章

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

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

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

    mybatis插件實現(xiàn)自定義改寫表名實例代碼

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

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

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

    Java關(guān)于重排鏈表詳細解析

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

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

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

    MyBatis一對一級聯(lián)更新問題小結(jié)

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

    詳解微信開發(fā)之Author網(wǎng)頁授權(quán)

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

    Spring Validation數(shù)據(jù)校驗詳解

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

    泸西县| 盐津县| 兖州市| 通化县| 玛沁县| 蒙阴县| 上思县| 伊通| 高淳县| 苍溪县| 香格里拉县| 梨树县| 平顺县| 阿合奇县| 土默特右旗| 鄄城县| 涟源市| 博兴县| 锡林郭勒盟| 堆龙德庆县| 清徐县| 改则县| 炎陵县| 富裕县| 客服| 仁布县| 福鼎市| 四子王旗| 体育| 思南县| 万年县| 靖州| 黄骅市| 秦安县| 和硕县| 保靖县| 合江县| 土默特右旗| 岑溪市| 昌宁县| 永和县|