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

Java實(shí)現(xiàn)自定義線程池拒絕策略的完整代碼

 更新時(shí)間:2026年02月03日 09:01:24   作者:康小莊  
自定義拒絕策略的核心是實(shí)現(xiàn)java.util.concurrent.RejectedExecutionHandler接口,這篇文章主要介紹了如何使用Java實(shí)現(xiàn)自定義線程池拒絕策略,感興趣的小伙伴可以了解下

自定義拒絕策略的核心是實(shí)現(xiàn)java.util.concurrent.RejectedExecutionHandler接口,重寫唯一的rejectedExecution(Runnable r, ThreadPoolExecutor executor)方法:

  • 參數(shù)r:被線程池拒絕的任務(wù)實(shí)例;
  • 參數(shù)executor:當(dāng)前線程池實(shí)例,可通過它獲取實(shí)時(shí)運(yùn)行狀態(tài)(活躍線程數(shù)、隊(duì)列任務(wù)數(shù)、完成任務(wù)數(shù)等),用于問題排查。
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 自定義拒絕策略Demo:詳細(xì)日志+線程池狀態(tài)監(jiān)控
 */
public class CustomRejectPolicyDemo {

    // 1. 實(shí)現(xiàn)RejectedExecutionHandler,自定義拒絕策略
    static class MyCustomRejectPolicy implements RejectedExecutionHandler {
        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            // 核心:打印詳細(xì)拒絕日志 + 線程池實(shí)時(shí)狀態(tài)(生產(chǎn)級(jí)排查必備)
            String rejectLog = String.format(
                    "===== 任務(wù)被拒絕 =====\n" +
                    "拒絕時(shí)間:%s\n" +
                    "被拒任務(wù):%s\n" +
                    "線程池狀態(tài):運(yùn)行中=%s | 核心線程數(shù)=%d | 最大線程數(shù)=%d\n" +
                    "當(dāng)前狀態(tài):活躍線程數(shù)=%d | 隊(duì)列任務(wù)數(shù)=%d | 已完成任務(wù)數(shù)=%d | 總?cè)蝿?wù)數(shù)=%d",
                    System.currentTimeMillis(),
                    r.toString(),
                    executor.isRunning(), // 線程池是否處于RUNNING狀態(tài)
                    executor.getCorePoolSize(),
                    executor.getMaximumPoolSize(),
                    executor.getActiveCount(), // 實(shí)時(shí)活躍線程數(shù)
                    executor.getQueue().size(), // 隊(duì)列中等待的任務(wù)數(shù)
                    executor.getCompletedTaskCount(), // 已完成的任務(wù)總數(shù)
                    executor.getTaskCount() // 提交的總?cè)蝿?wù)數(shù)(完成+執(zhí)行中+隊(duì)列中)
            );
            // 實(shí)際生產(chǎn)中可替換為SLF4J/Logback日志框架
            System.err.println(rejectLog);
            // 可選:根據(jù)業(yè)務(wù)需求擴(kuò)展(如任務(wù)持久化到MQ/Redis、觸發(fā)限流告警、主線程兜底執(zhí)行等)
        }
    }

    // 2. 自定義線程工廠(可選,用于設(shè)置線程名,便于排查任務(wù)執(zhí)行線程)
    static class MyThreadFactory implements ThreadFactory {
        private final AtomicInteger threadId = new AtomicInteger(1);
        private final String threadPrefix = "biz-worker-thread-";

        @Override
        public Thread newThread(Runnable r) {
            Thread thread = new Thread(r, threadPrefix + threadId.getAndIncrement());
            thread.setDaemon(false); // 非守護(hù)線程,保證任務(wù)執(zhí)行完成
            thread.setPriority(Thread.NORM_PRIORITY); // 正常優(yōu)先級(jí)
            return thread;
        }
    }

    // 主程序:測(cè)試自定義拒絕策略
    public static void main(String[] args) throws InterruptedException {
        // 線程池核心參數(shù):故意設(shè)置小參數(shù),方便觸發(fā)拒絕策略
        int corePoolSize = 2;    // 核心線程數(shù)
        int maximumPoolSize = 4; // 最大線程數(shù)
        long keepAliveTime = 1;  // 非核心線程空閑超時(shí)時(shí)間
        int queueCapacity = 2;   // 任務(wù)隊(duì)列容量(有限隊(duì)列,必選,否則無法觸發(fā)拒絕策略)

        // 3. 創(chuàng)建線程池,指定【自定義拒絕策略】
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                corePoolSize,
                maximumPoolSize,
                keepAliveTime,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(queueCapacity), // 有限容量隊(duì)列,觸發(fā)拒絕策略的關(guān)鍵
                new MyThreadFactory(), // 自定義線程工廠(可選)
                new MyCustomRejectPolicy() // 核心:指定自定義拒絕策略
        );

        try {
            // 提交7個(gè)任務(wù),觸發(fā)拒絕策略(2核心+2隊(duì)列+2非核心=6,第7個(gè)任務(wù)被拒絕)
            for (int i = 1; i <= 7; i++) {
                int taskId = i;
                executor.submit(() -> {
                    try {
                        // 模擬任務(wù)執(zhí)行耗時(shí)1秒
                        TimeUnit.SECONDS.sleep(1);
                        System.out.printf("任務(wù)%d執(zhí)行成功,執(zhí)行線程:%s%n", taskId, Thread.currentThread().getName());
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                        System.out.printf("任務(wù)%d被中斷%n", taskId);
                    }
                });
                System.out.printf("任務(wù)%d已提交%n", taskId);
            }
        } finally {
            // 4. 優(yōu)雅關(guān)閉線程池(必須,避免資源泄漏)
            executor.shutdown();
            // 等待線程池終止,超時(shí)則強(qiáng)制關(guān)閉
            if (!executor.awaitTermination(5, TimeUnit.SECONDS)) {
                executor.shutdownNow();
            }
        }
    }
}

本次線程池參數(shù)設(shè)置為核心2+最大4+隊(duì)列2,總處理能力 = 6(2 核心線程執(zhí)行 + 2 隊(duì)列等待 + 2 非核心線程執(zhí)行),提交第 7 個(gè)任務(wù)時(shí),滿足任務(wù)隊(duì)列已滿 + 線程數(shù)達(dá)到 maximumPoolSize,觸發(fā)自定義拒絕策略。

任務(wù)1已提交
任務(wù)2已提交
任務(wù)3已提交
任務(wù)4已提交
任務(wù)5已提交
任務(wù)6已提交
任務(wù)7已提交
===== 任務(wù)被拒絕 =====
拒絕時(shí)間:1738456200000
被拒任務(wù):java.util.concurrent.FutureTask@1b6d3586
線程池狀態(tài):運(yùn)行中=true | 核心線程數(shù)=2 | 最大線程數(shù)=4
當(dāng)前狀態(tài):活躍線程數(shù)=4 | 隊(duì)列任務(wù)數(shù)=2 | 已完成任務(wù)數(shù)=0 | 總?cè)蝿?wù)數(shù)=7
任務(wù)1執(zhí)行成功,執(zhí)行線程:biz-worker-thread-1
任務(wù)2執(zhí)行成功,執(zhí)行線程:biz-worker-thread-2
任務(wù)3執(zhí)行成功,執(zhí)行線程:biz-worker-thread-3
任務(wù)4執(zhí)行成功,執(zhí)行線程:biz-worker-thread-4
任務(wù)5執(zhí)行成功,執(zhí)行線程:biz-worker-thread-1
任務(wù)6執(zhí)行成功,執(zhí)行線程:biz-worker-thread-2

  • 自定義拒絕策略必須實(shí)現(xiàn)RejectedExecutionHandler接口,重寫rejectedExecution方法;
  • 觸發(fā)拒絕策略的唯一條件:任務(wù)隊(duì)列已滿 + 線程池當(dāng)前線程數(shù)達(dá)到maximumPoolSize;
  • 通過ThreadPoolExecutor實(shí)例可獲取全量運(yùn)行狀態(tài),是生產(chǎn)排查任務(wù)拒絕問題的關(guān)鍵;
  • 線程池必須使用有限容量隊(duì)列,否則任務(wù)會(huì)無限入隊(duì),拒絕策略永遠(yuǎn)不會(huì)生效;
  • 業(yè)務(wù)結(jié)束后必須優(yōu)雅關(guān)閉線程池shutdown()+awaitTermination()),避免資源泄漏。

到此這篇關(guān)于Java實(shí)現(xiàn)自定義線程池拒絕策略的完整代碼的文章就介紹到這了,更多相關(guān)Java拒絕策略內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaOOP封裝實(shí)例解讀

    JavaOOP封裝實(shí)例解讀

    封裝通過private限制屬性訪問,提供get/set方法控制數(shù)據(jù)讀寫,確保值合法,示例中Student類屬性私有,Test類需調(diào)用set方法賦值并驗(yàn)證,get方法獲取值,實(shí)現(xiàn)數(shù)據(jù)隱藏與安全操作
    2025-09-09
  • IDEA中文亂碼的幾種常見解決方案

    IDEA中文亂碼的幾種常見解決方案

    IntelliJ IDEA 如果不進(jìn)行相關(guān)設(shè)置,可能會(huì)導(dǎo)致控制臺(tái)中文亂碼、配置文件中文亂碼等問題,非常影響編碼過程中進(jìn)行問題追蹤,所以本文給大家介紹了IDEA中文亂碼的幾種常見解決方案,需要的朋友可以參考下
    2025-04-04
  • WebClient拋UnsupportedMediaTypeException異常解決

    WebClient拋UnsupportedMediaTypeException異常解決

    這篇文章主要為大家介紹了WebClient拋UnsupportedMediaTypeException異常的解決方案,文中給大家介紹了六中方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • 分布式醫(yī)療掛號(hào)系統(tǒng)EasyExcel導(dǎo)入導(dǎo)出數(shù)據(jù)字典的使用

    分布式醫(yī)療掛號(hào)系統(tǒng)EasyExcel導(dǎo)入導(dǎo)出數(shù)據(jù)字典的使用

    這篇文章主要為大家介紹了分布式醫(yī)療掛號(hào)系統(tǒng)EasyExcel導(dǎo)入導(dǎo)出數(shù)據(jù)字典的使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • Spring?IoC容器與Bean管理項(xiàng)目實(shí)踐指南

    Spring?IoC容器與Bean管理項(xiàng)目實(shí)踐指南

    IoC容器的主要作用是解決組件之間的耦合問題,通過將組件之間的依賴關(guān)系交給IoC容器來管理,可以在不改變組件的代碼的情況下實(shí)現(xiàn)組件之間的解耦,這篇文章主要介紹了Spring?IoC容器與Bean管理項(xiàng)目的相關(guān)資料,需要的朋友可以參考下
    2025-08-08
  • SpringBoot之自定義Filter獲取請(qǐng)求參數(shù)與響應(yīng)結(jié)果案例詳解

    SpringBoot之自定義Filter獲取請(qǐng)求參數(shù)與響應(yīng)結(jié)果案例詳解

    這篇文章主要介紹了SpringBoot之自定義Filter獲取請(qǐng)求參數(shù)與響應(yīng)結(jié)果案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Java中的迭代器和foreach原理

    Java中的迭代器和foreach原理

    這篇文章主要介紹了Java中的迭代器和foreach原理,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • Java注解處理器簡(jiǎn)單實(shí)例

    Java注解處理器簡(jiǎn)單實(shí)例

    這篇文章主要介紹了Java注解處理器簡(jiǎn)單實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Leetcode常見鏈表問題及代碼示例

    Leetcode常見鏈表問題及代碼示例

    這篇文章主要介紹了Leetcode常見鏈表問題及代碼示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • SpringBoot請(qǐng)求參數(shù)相關(guān)注解說明小結(jié)

    SpringBoot請(qǐng)求參數(shù)相關(guān)注解說明小結(jié)

    這篇文章主要介紹了SpringBoot請(qǐng)求參數(shù)相關(guān)注解說明,主要包括@PathVariable,@RequestHeader、@CookieValue、@RequestBody和@RequestParam,本文結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    2022-05-05

最新評(píng)論

平南县| 莱西市| 嘉定区| 康乐县| 福州市| 岳阳市| 和田县| 德清县| 临泉县| 咸宁市| 阜宁县| 渭南市| 克什克腾旗| 通州市| 蕉岭县| 天柱县| 那坡县| 凌源市| 安平县| 泉州市| 牙克石市| 格尔木市| 姚安县| 南木林县| 开江县| 砀山县| 武陟县| 山阳县| 阿鲁科尔沁旗| 卓尼县| 徐州市| 广饶县| 靖州| 乐都县| 新田县| 朔州市| 丘北县| 山阳县| 安龙县| 灵山县| 贡嘎县|