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

招行一面:Java 線程池的拒絕策略有哪些?如何選擇?

開發 后端
本文,我們通過源碼分析了Java 線程池提供的拒絕策略,開發者可以根據具體的場景選擇合適的策略,甚至可以設計自定義策略來滿足特定需求,避免因過載導致的系統崩潰。

Java線程池中的拒絕策略是線程池框架提供的一種機制,用于處理當線程池中的任務隊列已滿且沒有空閑線程可用來執行新任務時的情況。這篇文章,我們來一起了解這些拒絕策略的原理、源碼實現及其適用場景。

Java的線程池類ThreadPoolExecutor位于java.util.concurrent 包中,它是一個靈活且廣泛使用的線程池實現。線程池通過重用線程來減少線程創建和銷毀的開銷,提高應用程序的性能,線程池的基本組成如下:

  • 核心線程數 (corePoolSize): 核心線程數是線程池在空閑時仍保留的線程數。
  • 最大線程數 (maximumPoolSize): 線程池中允許的最大線程數。
  • 任務隊列 (workQueue): 用于保存等待執行任務的阻塞隊列。
  • 線程工廠 (ThreadFactory): 用于創建新線程的工廠。
  • 拒絕策略 (RejectedExecutionHandler): 當任務無法提交到線程池時,如何處理任務的策略。

拒絕策略的類型

ThreadPoolExecutor 提供了四種內置的拒絕策略:

  • AbortPolicy: 默認策略。直接拋出 RejectedExecutionException,阻止系統正常工作。
  • CallerRunsPolicy: 提交任務的線程自己執行該任務。
  • DiscardPolicy: 直接丟棄任務,不予任何處理。
  • DiscardOldestPolicy: 丟棄隊列中最舊的任務,然后嘗試重新提交當前任務。

AbortPolicy

AbortPolicy策略是直接拋出 RejectedExecutionException,不執行任務。適合在需要明確知道任務被拒絕時使用。

下面是AbortPolicy的源碼實現:

public static class AbortPolicy implements RejectedExecutionHandler {
    public AbortPolicy() { }

    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        throw new RejectedExecutionException("Task " + r.toString() +
                                             " rejected from " +
                                             e.toString());
    }
}

使用場景:

  • 在高可靠性系統中,AbortPolicy 可用于快速發現問題并進行處理。
  • 當任務提交失敗后需要立即采取補救措施時。

CallerRunsPolicy

CallerRunsPolicy策略由提交任務的線程(通常是主線程)來執行該任務,通過降低任務提交速率來緩解壓力。

下面是CallerRunsPolicy的源碼實現:

public static class CallerRunsPolicy implements RejectedExecutionHandler {
    public CallerRunsPolicy() { }

    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        if (!e.isShutdown()) {
            r.run();
        }
    }
}

使用場景:

  • 適用于不希望丟棄任務且能接受任務執行延遲的場景。
  • 可用于削峰填谷,防止任務過快提交。

DiscardPolicy

DiscardPolicy策略是指直接丟棄無法執行的任務,不拋異常,也就是不對被丟棄的任務進行任何處理。

下面是DiscardPolicy的源碼實現:

public static class DiscardPolicy implements RejectedExecutionHandler {
    public DiscardPolicy() { }

    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        // Do nothing
    }
}

使用場景:

  • 適用于不關心單個任務被丟棄的場景。
  • 在負載極高且系統能容忍數據丟失的情況下。

DiscardOldestPolicy

DiscardOldestPolicy策略會丟棄隊列中最舊的任務,然后嘗試重新提交當前任務,這種策略通常用于保證新任務有機會被執行。

下面是DiscardOldestPolicy的源碼實現:

public static class DiscardOldestPolicy implements RejectedExecutionHandler {
    public DiscardOldestPolicy() { }

    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        if (!e.isShutdown()) {
            e.getQueue().poll(); // discard oldest
            e.execute(r); // retry
        }
    }
}

使用場景:

  • 適用于需要保證最新任務的優先級高于舊任務的場景。
  • 在新任務更重要的實時系統中。

自定義拒絕策略

除了內置策略,開發者可以實現 RejectedExecutionHandler 接口來定義自己的拒絕策略,通過這種方式,開發者可以根據具體需求來處理被拒絕的任務。下面是實現自定義策略的步驟:

  • 實現RejectedExecutionHandler接口。
  • 覆蓋rejectedExecution方法,定義拒絕策略。
  • 在ThreadPoolExecutor的構造函數中傳入自定義策略。

代碼示例如下:

public class CustomRejectedExecutionHandler implements RejectedExecutionHandler {
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        // 自定義拒絕邏輯,例如日志記錄或重新嘗試
        log.warn("This is custom rejected: " + r.toString());
        // 可以選擇重新提交任務或其他處理
    }
}

最后,我們再通過代碼來展示如何創建一個線程池以及如何使用拒絕策略:

import java.util.concurrent.*;

public class ThreadPoolExample {
    public static void main(String[] args) {
        // 定義線程池的參數
        int corePoolSize = 2;
        int maximumPoolSize = 4;
        long keepAliveTime = 10;
        TimeUnit unit = TimeUnit.SECONDS;
        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(2);

        // 創建線程池
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
            corePoolSize,
            maximumPoolSize,
            keepAliveTime,
            unit,
            workQueue,
            new ThreadPoolExecutor.AbortPolicy() // 默認策略
            // new ThreadPoolExecutor.CallerRunsPolicy()
            // new ThreadPoolExecutor.DiscardPolicy()
            // new ThreadPoolExecutor.DiscardOldestPolicy()
            // new CustomRejectedExecutionHandler()
        );

        // 關閉線程池
        threadPool.shutdown();
    }
}

使用場景分析

不同的拒絕策略適合不同場景,下面是選擇拒絕策略的一些參考因素:

  • 實時性要求高: 如果系統不能接受任務被長時間阻塞或丟棄,可以選擇 CallerRunsPolicy 或自定義策略,以確保任務被及時處理。
  • 任務重要性不同: 對于有些場景,新任務比舊任務更重要,可以選擇 DiscardOldestPolicy。
  • 任務丟失可接受: 在任務丟失對系統影響較小的情況下,可以選擇 DiscardPolicy,以保證系統整體的吞吐量。
  • 系統可靠性: 在系統需要對任務被拒絕進行明確處理時,AbortPolicy 可以幫助快速發現和響應。

總結

本文,我們通過源碼分析了Java 線程池提供的拒絕策略,整體來說拒絕策略是比較簡單的一個知識點,如果業務代碼中使用了線程池,拒絕策略是必須掌握的一個知識點,開發者可以根據具體的場景選擇合適的策略,甚至可以設計自定義策略來滿足特定需求,避免因過載導致的系統崩潰。

責任編輯:趙寧寧 來源: 猿java
相關推薦

2024-11-11 16:40:04

2022-03-14 07:32:06

線程池拒絕策略自定義

2023-08-15 15:33:29

線程池線程數

2020-11-25 11:33:47

Java線程技術

2024-09-27 16:33:44

2020-07-08 12:05:55

Java線程池策略

2024-10-22 15:25:20

2024-10-09 09:12:11

2020-02-18 14:25:51

Java線程池拒絕策略

2011-11-14 09:08:06

云計算數據存儲

2023-09-01 15:22:31

負載均衡服務器端客戶端

2024-10-09 15:58:02

2018-10-24 14:30:30

緩存服務更新

2022-05-10 08:11:15

MySQL技巧結構

2022-05-11 15:57:16

優化SQL

2025-05-15 09:45:54

2024-10-17 16:58:43

2025-03-28 08:10:00

Spring自動裝配Java

2022-07-01 15:40:02

云計算數據管理多云

2022-10-20 07:52:06

數據管理多云策略管理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕在线不卡 | 日韩一区二区在线视频 | 精品国产91| 亚洲精品中文在线观看 | 日韩欧美中文字幕在线观看 | 亚洲午夜av久久乱码 | 天天影视亚洲综合网 | 久久久久久久久99 | 91久久精品国产 | 欧美激情五月 | 日本精品一区二区三区在线观看视频 | 欧美不卡网站 | 亚洲人成在线播放 | 国产一区亚洲二区三区 | 成人欧美一区二区三区在线播放 | 男女网站免费观看 | 欧美一级免费看 | 免费看黄色视屏 | 中日av| 日本午夜视频 | 亚洲免费在线观看 | 波多野结衣av中文字幕 | 日日夜夜免费精品视频 | 97超在线视频 | 在线中文字幕av | 99精品久久久 | 国产精品久久久久一区二区三区 | 国产 日韩 欧美 制服 另类 | 中文字幕日本一区二区 | 日韩视频―中文字幕 | 青草青草久热精品视频在线观看 | 特级黄一级播放 | 天天艹逼网 | 亚洲天堂久久新 | 亚洲欧洲视频 | 99久久国产综合精品麻豆 | 黄色毛片黄色毛片 | 成人水多啪啪片 | 亚洲精品1区2区3区 91免费看片 | 亚洲国产精品一区二区三区 | 中文成人无字幕乱码精品 |