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

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

 更新時間: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),核心線程也不會被回收(默認(rèn)情況下)。
  • 作用
    • 在任務(wù)量較少時,線程池會優(yōu)先創(chuàng)建核心線程來執(zhí)行任務(wù)。
  • 配置建議
    • 根據(jù)系統(tǒng)負(fù)載和任務(wù)特性設(shè)置。

2. maximumPoolSize

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

3. keepAliveTime

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

4. unit

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

5. workQueue

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

常用隊列類型

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

6. threadFactory

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

7. handler

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

2.2 線程池的工作流程

  • 提交任務(wù)
    • 任務(wù)通過 execute() 或 submit() 方法提交到線程池。
  • 任務(wù)處理
    • 如果線程數(shù)未達(dá)到 corePoolSize,創(chuàng)建新線程處理任務(wù)。
    • 如果線程數(shù)已達(dá)到 corePoolSize,任務(wù)進(jìn)入 workQueue 等待。
    • 如果隊列已滿,且線程數(shù)小于 maximumPoolSize,創(chuàng)建新線程處理任務(wù)。
    • 如果隊列已滿,且線程數(shù)達(dá)到 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()

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

    • 支持定時和周期性任務(wù)的線程池。
    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(), // 默認(rèn)線程工廠
    new ThreadPoolExecutor.AbortPolicy() // 拒絕策略
);

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

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

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

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

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

4.3 隊列類型(workQueue)

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

4.4 拒絕策略(handler)

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

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

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

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

相關(guān)文章

  • Mybatis-plus自動填充不生效或自動填充數(shù)據(jù)為null原因及解決方案

    Mybatis-plus自動填充不生效或自動填充數(shù)據(jù)為null原因及解決方案

    本文主要介紹了Mybatis-plus自動填充不生效或自動填充數(shù)據(jù)為null原因及解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Java讀取DWG文件的完整步驟

    Java讀取DWG文件的完整步驟

    DWG 是 AutoCAD 的專有二進(jìn)制格式,直接解析難度大,通過開源庫 Teigha File Converter(現(xiàn)更名 ODA File Converter)可實現(xiàn)格式轉(zhuǎn)換,間接讀取數(shù)據(jù),本文給大家介紹了Java讀取DWG文件的完整步驟,需要的朋友可以參考下
    2025-11-11
  • idea運行java的配置詳細(xì)教程(包含maven,mysql下載配置)

    idea運行java的配置詳細(xì)教程(包含maven,mysql下載配置)

    程序員們在開發(fā)的時候,一定會用到Intellij?IDEA這個集成開發(fā)環(huán)境,這篇文章主要給大家介紹了關(guān)于idea運行java的配置(包含maven,mysql下載配置)的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • mybatis-plus邏輯刪除與唯一約束沖突問題

    mybatis-plus邏輯刪除與唯一約束沖突問題

    本文探討了MyBatis-Plus邏輯刪除與唯一約束沖突的問題,分析了產(chǎn)生沖突的原因,并提出了解決方案,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Spring Security基于過濾器實現(xiàn)圖形驗證碼功能

    Spring Security基于過濾器實現(xiàn)圖形驗證碼功能

    驗證碼就是為了防止惡意用戶采用暴力重試的攻擊手段而設(shè)置的一種防護(hù)措施,接下來在Spring Security的環(huán)境中,我們可以用兩種方案實現(xiàn)圖形驗證碼,具體實現(xiàn)方法跟隨小編一起看看吧
    2021-09-09
  • 一文搞懂Spring AOP的五大通知類型

    一文搞懂Spring AOP的五大通知類型

    本文將詳細(xì)為大家介紹Spring AOP的五種通知類型(前置通知、后置通知、返回通知、異常通知、環(huán)繞通知),感興趣的朋友可以了解一下
    2022-06-06
  • 關(guān)于Seata基本使用及二階提交流程

    關(guān)于Seata基本使用及二階提交流程

    這篇文章主要介紹了關(guān)于Seata基本使用及二階提交流程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • JAVA新手小白學(xué)正則表達(dá)式、包裝類、自動裝箱/自動拆箱以及BigDecimal

    JAVA新手小白學(xué)正則表達(dá)式、包裝類、自動裝箱/自動拆箱以及BigDecimal

    這篇文章主要給大家介紹了關(guān)于JAVA新手小白學(xué)正則表達(dá)式、包裝類、自動裝箱/自動拆箱以及BigDecimal的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-03-03
  • java.net.URL超時時間默認(rèn)無限制問題小結(jié)

    java.net.URL超時時間默認(rèn)無限制問題小結(jié)

    文章介紹了如何在Java中使用URLConnection或HttpURLConnection設(shè)置連接和讀取超時,以處理網(wǎng)絡(luò)問題導(dǎo)致的長時間等待,通過httpstat.us網(wǎng)站可以測試不同延遲的請求,并演示了如何通過調(diào)整超時時間處理超時異常,感興趣的朋友一起看看吧
    2025-02-02
  • 深入理解Java中的String(示例詳解)

    深入理解Java中的String(示例詳解)

    文章詳細(xì)介紹了Java中String類的特點、用途、主要方法以及常見用法,String類是不可變的,具有字符串常量池,特定的內(nèi)存結(jié)構(gòu),并隨JDK版本更新而優(yōu)化,它廣泛用于表示和處理文本數(shù)據(jù),并在內(nèi)存管理和性能優(yōu)化方面表現(xiàn)出色,感興趣的朋友一起看看吧
    2025-03-03

最新評論

宁南县| 略阳县| 平利县| 元江| 彭州市| 镇赉县| 荣成市| 扶沟县| 洛南县| 嘉峪关市| 金昌市| 黔西县| 镇康县| 普陀区| 奉化市| 栾川县| 米脂县| 榕江县| 韶关市| 天柱县| 新密市| 青浦区| 客服| 石泉县| 泗水县| 巨野县| 玛纳斯县| 锡林郭勒盟| 神池县| 天镇县| 荔波县| 平定县| 金溪县| 平邑县| 鄂温| 巴里| 枣强县| 通许县| 德令哈市| 临西县| 阳山县|