欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java線程池參數(shù)舉例詳解(附詳細代碼)

 更新時間:2025年02月15日 08:53:00   作者:飛滕人生TYF  
這篇文章主要介紹了Java線程池的工作原理、構(gòu)造方法和關(guān)鍵參數(shù),它還提供了線程池的工作流程、常用線程池實現(xiàn)及參數(shù)優(yōu)化建議,幫助開發(fā)者更好地管理和優(yōu)化線程池,需要的朋友可以參考下

前言

Java 線程池是通過 java.util.concurrent 提供的 Executor 框架實現(xiàn)的。線程池主要由 ThreadPoolExecutor 類支持,它提供了靈活的配置參數(shù),允許開發(fā)者根據(jù)需求調(diào)整線程池的行為和性能。

1. 線程池的構(gòu)造方法

ThreadPoolExecutor 提供了一個核心構(gòu)造方法,允許指定線程池的關(guān)鍵參數(shù):

public ThreadPoolExecutor(
    int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue,
    ThreadFactory threadFactory,
    RejectedExecutionHandler handler
)

2. 線程池參數(shù)解析

2.1 核心參數(shù)

1. corePoolSize

  • 定義
    • 核心線程數(shù),即線程池中始終保持存活的線程數(shù)量。
    • 即使線程池處于空閑狀態(tài),核心線程也不會被回收(默認情況下)。
  • 作用
    • 在任務量較少時,線程池會優(yōu)先創(chuàng)建核心線程來執(zhí)行任務。
  • 配置建議
    • 根據(jù)系統(tǒng)負載和任務特性設(shè)置。

2. maximumPoolSize

  • 定義
    • 線程池中允許的最大線程數(shù)(包括核心線程)。
    • 當任務隊列滿時,線程池會繼續(xù)創(chuàng)建非核心線程,直到達到最大線程數(shù)。
  • 作用
    • 控制線程池的最大并發(fā)能力。
  • 配置建議
    • 設(shè)置為合適的值以避免線程過多導致系統(tǒng)資源耗盡。

3. keepAliveTime

  • 定義
    • 非核心線程的存活時間(當線程處于空閑狀態(tài)時)。
    • 超過此時間未執(zhí)行任務的非核心線程會被銷毀。
  • 作用
    • 控制線程池資源的回收效率。
  • 配置建議
    • 對于需要快速響應的線程池,可設(shè)置較短的存活時間。

4. unit

  • 定義
    • keepAliveTime 的時間單位。
    • 取值范圍為 TimeUnit 枚舉,包括:
      • TimeUnit.MILLISECONDS(毫秒)
      • TimeUnit.SECONDS(秒)
      • TimeUnit.MINUTES(分鐘)
  • 作用
    • 規(guī)范存活時間的粒度。

5. workQueue

  • 定義
    • 一個阻塞隊列,用于存儲等待執(zhí)行的任務。
    • 如果線程池中的線程數(shù)已達到 corePoolSize,新任務會被加入隊列等待。

常用隊列類型

  • ArrayBlockingQueue
    • 有界隊列,必須指定容量。
    • 當隊列滿時,新任務會觸發(fā)線程池擴容。
  • LinkedBlockingQueue
    • 無界隊列(理論上容量無限制)。
    • 如果使用無界隊列,maximumPoolSize 參數(shù)將失效。
  • SynchronousQueue
    • 不存儲任務的隊列,每次提交的任務必須直接交給線程處理。
    • 如果沒有空閑線程,線程池會立即創(chuàng)建新線程。
  • PriorityBlockingQueue
    • 支持任務排序的隊列。
    • 提交的任務會根據(jù)優(yōu)先級排序。

6. threadFactory

  • 定義
    • 用于創(chuàng)建線程的工廠類。
  • 作用
    • 可以自定義線程名稱、線程優(yōu)先級、是否為守護線程等。
  • 示例
    ThreadFactory factory = r -> {
        Thread thread = new Thread(r);
        thread.setName("CustomThread-" + thread.getId());
        return thread;
    };
    

7. handler

  • 定義
    • 拒絕策略,表示當線程池無法接受新任務時的處理方式。
  • 觸發(fā)場景
    • 當任務隊列已滿且線程池中的線程數(shù)已達到 maximumPoolSize 時。
  • 常見策略(RejectedExecutionHandler 接口實現(xiàn)):AbortPolicy(默認):
    • 拋出 RejectedExecutionException 異常。
    CallerRunsPolicy
    • 由提交任務的線程直接執(zhí)行任務。
    DiscardPolicy
    • 丟棄任務,不拋出異常。
    DiscardOldestPolicy
    • 丟棄最早的任務(隊列頭部任務),然后重新嘗試提交新任務。

2.2 線程池的工作流程

  • 提交任務
    • 任務通過 execute() 或 submit() 方法提交到線程池。
  • 任務處理
    • 如果線程數(shù)未達到 corePoolSize,創(chuàng)建新線程處理任務。
    • 如果線程數(shù)已達到 corePoolSize,任務進入 workQueue 等待。
    • 如果隊列已滿,且線程數(shù)小于 maximumPoolSize,創(chuàng)建新線程處理任務。
    • 如果隊列已滿,且線程數(shù)達到 maximumPoolSize,觸發(fā)拒絕策略。
  • 線程回收
    • 超過 keepAliveTime 未使用的非核心線程會被銷毀。

3. 常用線程池實現(xiàn)

Java 提供了一些線程池的便捷方法:

3.1 Executors 工廠方法

  • newFixedThreadPool(int nThreads)

    • 固定大小的線程池。
    • 核心線程數(shù)和最大線程數(shù)相等,使用無界隊列。
    ExecutorService fixedPool = Executors.newFixedThreadPool(5);
    
  • newCachedThreadPool()

    • 可緩存線程池。
    • 線程池大小無限制,線程空閑超過 60 秒會被回收。
    ExecutorService cachedPool = Executors.newCachedThreadPool();
    
  • newSingleThreadExecutor()

    • 單線程的線程池。
    • 保證任務按提交順序執(zhí)行。
    ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
    
  • newScheduledThreadPool(int corePoolSize)

    • 支持定時和周期性任務的線程池。
    ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(5);
    

3.2 自定義線程池

通過 ThreadPoolExecutor 構(gòu)造一個自定義線程池:

ExecutorService customPool = new ThreadPoolExecutor(
    2,                      // 核心線程數(shù)
    4,                      // 最大線程數(shù)
    60,                     // 非核心線程存活時間
    TimeUnit.SECONDS,        // 存活時間單位
    new ArrayBlockingQueue<>(10), // 阻塞隊列
    Executors.defaultThreadFactory(), // 默認線程工廠
    new ThreadPoolExecutor.AbortPolicy() // 拒絕策略
);

4. 參數(shù)配置的優(yōu)化建議

4.1 核心線程數(shù)(corePoolSize)

  • I/O 密集型任務
    • 核心線程數(shù)通常設(shè)置為 2 * CPU 核心數(shù)。
    • 任務需要頻繁等待外部資源(如磁盤、網(wǎng)絡),線程數(shù)可以適當增加。
  • CPU 密集型任務
    • 核心線程數(shù)設(shè)置為 CPU 核心數(shù) + 1
    • 線程數(shù)過多會增加上下文切換的開銷。

4.2 最大線程數(shù)(maximumPoolSize)

  • 線程池的大小應在系統(tǒng)資源允許范圍內(nèi),避免線程數(shù)過多導致資源耗盡。

4.3 隊列類型(workQueue)

  • 短任務隊列
    • 使用 SynchronousQueue,不存儲任務,適合高吞吐場景。
  • 有限任務隊列
    • 使用 ArrayBlockingQueue 限制隊列長度,防止內(nèi)存溢出。
  • 優(yōu)先級隊列
    • 使用 PriorityBlockingQueue,適合需要任務排序的場景。

4.4 拒絕策略(handler)

  • 高可靠性
    • 使用 CallerRunsPolicy,將任務回退到調(diào)用線程執(zhí)行。
  • 低優(yōu)先級任務
    • 使用 DiscardPolicy 或 DiscardOldestPolicy 丟棄任務。

5. 示例代碼

import java.util.concurrent.*;

public class ThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService threadPool = new ThreadPoolExecutor(
            2,                      // 核心線程數(shù)
            4,                      // 最大
線程數(shù)
            60L,                    // 空閑線程存活時間
            TimeUnit.SECONDS,        // 時間單位
            new LinkedBlockingQueue<>(10), // 阻塞隊列
            Executors.defaultThreadFactory(), // 線程工廠
            new ThreadPoolExecutor.CallerRunsPolicy() // 拒絕策略
        );

        for (int i = 0; i < 20; i++) {
            threadPool.execute(() -> {
                System.out.println(Thread.currentThread().getName() + " is executing");
            });
        }

        threadPool.shutdown();
    }
}

6. 總結(jié)

參數(shù)作用優(yōu)化建議
corePoolSize核心線程數(shù),始終存活的線程數(shù)根據(jù)任務類型和系統(tǒng)資源合理設(shè)置
maximumPoolSize最大線程數(shù),限制線程池最大并發(fā)量避免設(shè)置過高,防止資源耗盡
keepAliveTime非核心線程的存活時間根據(jù)響應需求調(diào)整
workQueue等待任務隊列,存儲未處理的任務使用合適的隊列類型
handler拒絕策略,決定任務無法處理時的行為根據(jù)任務重要性選擇合適的策略

通過合理配置線程池參數(shù),可以顯著提升多線程程序的性能和資源利用率。

到此這篇關(guān)于java線程池參數(shù)舉例詳解的文章就介紹到這了,更多相關(guān)java線程池參數(shù)詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實現(xiàn)把對象數(shù)組通過excel方式導出的功能

    java實現(xiàn)把對象數(shù)組通過excel方式導出的功能

    本文主要介紹了java實現(xiàn)把對象數(shù)組通過excel方式導出的功能的相關(guān)知識。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-03-03
  • Java操作MinIO實現(xiàn)文件的上傳和刪除

    Java操作MinIO實現(xiàn)文件的上傳和刪除

    本文主要介紹如何將本地Java項目resources目錄下的一個PNG圖片上傳到MinIO,然后將上傳的圖片刪除,文中有詳細的流程步驟和示例代碼,需要的朋友可以參考下
    2023-06-06
  • java面向?qū)ο笤O(shè)計原則之接口隔離原則示例詳解

    java面向?qū)ο笤O(shè)計原則之接口隔離原則示例詳解

    這篇文章主要為大家介紹了java面向?qū)ο笤O(shè)計原則之接口隔離原則的示例詳解,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進步早日升職加薪
    2021-10-10
  • Java泛型繼承原理與用法詳解

    Java泛型繼承原理與用法詳解

    這篇文章主要介紹了Java泛型繼承原理與用法,結(jié)合實例形式分析了java泛型繼承的相關(guān)原理與實現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07
  • Java設(shè)計模式之外觀模式

    Java設(shè)計模式之外觀模式

    這篇文章介紹了Java設(shè)計模式之外觀模式,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • Java8 Lamdba函數(shù)式推導

    Java8 Lamdba函數(shù)式推導

    這篇文章主要介紹了Java8 Lamdba函數(shù)式推導,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 利用Springboot+vue實現(xiàn)圖片上傳至數(shù)據(jù)庫并顯示的全過程

    利用Springboot+vue實現(xiàn)圖片上傳至數(shù)據(jù)庫并顯示的全過程

    最近遇到個需求,需要將圖片在前端上傳到服務器進行保存,然后讀取到前端進行展示,這篇文章主要給大家介紹了關(guān)于利用Springboot+vue實現(xiàn)圖片上傳至數(shù)據(jù)庫并顯示的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Java程序啟動時初始化數(shù)據(jù)的四種方式

    Java程序啟動時初始化數(shù)據(jù)的四種方式

    本文主要介紹了Java程序啟動時初始化數(shù)據(jù)的四種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-02-02
  • springboot打包如何忽略Test單元測試

    springboot打包如何忽略Test單元測試

    這篇文章主要介紹了springboot打包如何忽略Test單元測試,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • mybatis中xml之trim屬性說明

    mybatis中xml之trim屬性說明

    這篇文章主要介紹了mybatis中xml之trim屬性說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論