成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么阿里巴巴Java開發手冊禁止使用Executors創建線程池?

開發 前端
當你的應用在高峰期突然宕機,日志中出現大量OOM異常時,你是否想過罪魁禍首可能是那幾行看似無害的Executors代碼?

在Java并發編程中,線程池是提高系統性能的關鍵組件,而Executors工廠方法提供了創建線程池的便捷途徑。許多開發者習慣性地使用Executors.newFixedThreadPool()或Executors.newCachedThreadPool()來快速實現并發任務處理,殊不知這種看似便利的方式卻暗藏巨大風險。

當你的應用在高峰期突然宕機,日志中出現大量OOM異常時,你是否想過罪魁禍首可能是那幾行看似無害的Executors代碼?這正是為什么《阿里巴巴Java開發手冊》將"禁止使用Executors創建線程池"列為強制性規范。

在這里插入圖片描述

一、為什么禁止使用Executors工廠方法

1.資源耗盡風險

newFixedThreadPool和newSingleThreadExecutor,內部使用無界的LinkedBlockingQueue,允許請求隊列無限增長,可能導致OOM(內存溢出)

newCachedThreadPool和newScheduledThreadPool,允許創建的線程數量為Integer.MAX_VALUE,可能會創建大量線程,導致系統資源耗盡

2.無法精細控制

工廠方法使用了預設的參數,無法根據實際業務場景進行精細調整,隱藏了線程池的實際運行機制,開發人員難以意識到潛在風險。

二、案例1:電商系統中的訂單處理服務OOM問題

在電商系統的秒殺活動中,訂單處理服務使用Executors.newFixedThreadPool(10)創建線程池,當遇到大量請求時,任務隊列無限增長導致內存溢出。

newFixedThreadPool內部使用LinkedBlockingQueue沒有設置容量上限,請求堆積時內存會持續增長。

// 問題代碼
ExecutorService executorService = Executors.newFixedThreadPool(10);
// 大量提交任務
for (Order order : orders) {
    executorService.submit(() -> processOrder(order));
}

使用ThreadPoolExecutor手動創建線程池,并設置合理的隊列大小和拒絕策略。

// 優化后的代碼
ThreadPoolExecutor executor = new ThreadPoolExecutor(
    5,                       // 核心線程數
    10,                      // 最大線程數
    60L, TimeUnit.SECONDS,   // 線程空閑超時時間
    new LinkedBlockingQueue<>(1000), // 有界隊列,容量為1000
    new ThreadFactory() {
        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r);
            t.setName("order-process-thread-" + t.getId());
            return t;
        }
    },
    new ThreadPoolExecutor.CallerRunsPolicy() // 拒絕策略:由調用線程執行
);

// 提交任務
for (Order order : orders) {
    executor.submit(() -> processOrder(order));
}

隊列有明確的容量上限防止內存溢出,線程數有明確上限,使用CallerRunsPolicy在系統超負荷時能夠自動降速,自定義線程名稱便于問題排查。

三、案例2:定時任務系統線程爆炸

企業內部的定時任務系統使用Executors.newCachedThreadPool()處理各類定時任務,隨著業務增長,某天系統突然無響應。

// 問題代碼
ExecutorService executor = Executors.newCachedThreadPool();
// 定時任務系統中添加各種任務
for (Task task : tasks) {
    executor.submit(() -> executeTask(task));
}

newCachedThreadPool允許創建的最大線程數是Integer.MAX_VALUE,當系統負載較高時,會創建過多線程,導致線程上下文切換開銷巨大,最終系統崩潰。

手動創建線程池,限制最大線程數,并增加監控。

// 優化后的代碼
ThreadPoolExecutor executor = new ThreadPoolExecutor(
    10,                      // 核心線程數
    50,                      // 最大線程數(明確上限)
    3, TimeUnit.MINUTES,     // 非核心線程存活時間
    new ArrayBlockingQueue<>(2000), // 有界隊列
    new ThreadFactory() {
        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r);
            t.setName("scheduled-task-" + t.getId());
            t.setDaemon(true); // 設置為守護線程
            return t;
        }
    },
    new ThreadPoolExecutor.AbortPolicy() // 任務拒絕時拋出異常,便于及時發現問題
);

// 添加監控
executor.setRejectedExecutionHandler((r, e) -> {
    log.error("任務隊列已滿,任務被拒絕執行");
    // 觸發告警通知
    alertService.sendAlert("線程池隊列已滿,請檢查系統負載!");
    throw new RejectedExecutionException("線程池任務隊列已滿");
});

// 提交任務
for (Task task : tasks) {
    executor.submit(() -> executeTask(task));
}

明確限制最大線程數防止線程爆炸,避免過多的線程上下文切換,異常情況下能夠快速發現并告警,隊列和線程數都有明確上限。

在這里插入圖片描述

四、手動創建線程池的好處

1.資源可控性更強

明確指定線程數上限和任務隊列容量,避免資源耗盡。防止OOM(內存溢出)和線程爆炸問題,系統資源使用更加可預測和穩定。

2.業務適配性更好

根據業務特點精確調整參數,為IO密集型任務設置較高的線程數,為CPU密集型任務設置相對較少的線程數,可以針對不同業務場景設計不同參數配置的線程池。

3.異常處理更加優雅

自定義拒絕策略,系統超負荷時可以優雅降級,可以選擇合適的策略:調用者運行、丟棄任務、丟棄最老任務或拋出異常,甚至可以實現自定義的復雜拒絕處理邏輯,如將任務存入數據庫等。

4.監控能力更強

添加自定義監控和告警邏輯,可以實時監控線程池狀態,如活躍線程數、隊列深度等,在異常情況下及時觸發告警,避免系統崩潰。

5.問題排查更便捷

通過自定義ThreadFactory給線程池中的線程合理命名,便于在日志和線程轉儲中快速定位問題,可以添加額外的線程元數據,如來源業務、優先級等。

五、總結

《阿里巴巴Java開發手冊》禁止使用Executors創建線程池的規定并非過度謹慎,而是基于大量生產實踐經驗總結出的寶貴教訓。通過手動創建ThreadPoolExecutor,我們能夠明確控制線程數量上限和任務隊列容量,有效防止資源耗盡導致的系統崩潰。

在高并發場景下,線程池配置不當引發的問題往往具有突發性和災難性,可能在系統長期穩定運行后的某個峰值時刻突然爆發。正確的做法是遵循"自定義線程池參數、限制資源上限、設置拒絕策略、加強監控告警"的原則,根據業務特性精細調整線程池配置。

責任編輯:姜華 來源: 哪吒編程
相關推薦

2019-11-13 14:38:34

Executors阿里線程池

2020-09-14 09:47:56

Java開發類型

2024-01-03 08:15:35

Executors線程池線程

2024-02-28 07:37:53

JavaExecutors工具

2020-07-30 12:16:33

阿里巴巴Apache對象

2020-09-08 16:25:18

Apache BeancopyJava

2017-05-02 21:14:20

阿里巴巴Java開發

2020-09-22 11:40:53

BigDecimalequalsJava

2019-09-02 15:20:28

Java開發繼承

2019-09-04 11:02:54

繼承層次組合

2018-10-16 15:34:17

阿里巴巴Apache Flin大數據

2022-09-05 10:06:21

MySQL外循環內循環

2021-09-17 06:28:20

JOIN阿里Java

2021-08-04 17:20:30

阿里巴巴AsyncJava

2013-08-22 09:26:38

去IOE王堅

2022-08-30 16:38:30

阿里巴巴JavaLog4j

2021-10-11 09:32:40

包裝類型屬性

2016-09-21 20:28:55

阿里巴巴IOE

2019-06-26 07:54:53

ArrayListsubList源碼

2019-03-04 09:22:52

阿里巴巴foreach Java
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美人成在线视频 | 久久综合久色欧美综合狠狠 | 久草视频在线播放 | 亚洲精选一区二区 | 亚洲成人一区二区三区 | 日韩在线电影 | 成人黄色在线观看 | 黄色一级免费 | 日韩一区二区三区视频 | 国产成人在线看 | 国产亚洲成av人片在线观看桃 | 日韩精品 电影一区 亚洲 | 国产精品不卡 | 91啪影院| 国产一区中文字幕 | 国产精品色av | 精品国产黄a∨片高清在线 www.一级片 国产欧美日韩综合精品一区二区 | 黄色av免费网站 | 日韩a| 亚洲视频二区 | 黑人一级片视频 | 成人网在线 | 中文字幕 亚洲一区 | av在线天天 | 免费一区二区三区在线视频 | 九色在线视频 | 国产高清久久久 | 午夜电影在线播放 | 国内av在线 | 久久久精品 | 欧美大片久久久 | 久久久久国产一区二区三区四区 | 农村黄性色生活片 | 欧美日韩毛片 | 伊人色综合久久久天天蜜桃 | 毛片一级片| 欧美狠狠操| 国产色在线 | 999久久久久久久 | 国产日韩欧美精品一区二区 | 亚洲第一中文字幕 |