線程池實現及參數詳解

線程池概述

Java線程池是一種池化技術,用于管理和復用線程,減少線程創建和銷毀的開銷,提高系統性能。Java通過java.util.concurrent包提供了強大的線程池支持。

線程池參數詳解

1. 核心參數

// 創建線程池的完整構造函數
ThreadPoolExecutor(int corePoolSize,              // 核心線程數int maximumPoolSize,           // 最大線程數long keepAliveTime,            // 空閑線程存活時間TimeUnit unit,                 // 時間單位BlockingQueue<Runnable> workQueue, // 工作隊列ThreadFactory threadFactory,   // 線程工廠RejectedExecutionHandler handler  // 拒絕策略處理器
)

2. 參數詳細說明

corePoolSize(核心線程數)
  • 線程池中保持的最小線程數量,即使它們是空閑的

  • 除非設置了allowCoreThreadTimeOut,否則核心線程不會因空閑而被回收

maximumPoolSize(最大線程數)
  • 線程池允許創建的最大線程數量

  • 當工作隊列滿時,線程池會創建新線程直到達到此限制

keepAliveTime(線程空閑時間)
  • 當線程數大于核心線程數時,空閑線程在終止前等待新任務的最長時間

  • 僅適用于超出核心線程數的線程

unit(時間單位)
  • keepAliveTime參數的時間單位

  • 如TimeUnit.SECONDS、TimeUnit.MILLISECONDS等

workQueue(工作隊列)
  • 用于保存等待執行的任務的阻塞隊列

  • 常見實現:

    • ArrayBlockingQueue:有界隊列

    • LinkedBlockingQueue:無界隊列(默認Integer.MAX_VALUE)

    • SynchronousQueue:不存儲元素的隊列

    • PriorityBlockingQueue:具有優先級的隊列

threadFactory(線程工廠)
  • 用于創建新線程的工廠

  • 可以自定義線程名稱、優先級等

handler(拒絕策略)
  • 當線程池和工作隊列都滿時,處理新提交任務的策略

  • 內置策略:

    • AbortPolicy:默認策略,拋出RejectedExecutionException

    • CallerRunsPolicy:由調用線程執行該任務

    • DiscardPolicy:直接丟棄任務

    • DiscardOldestPolicy:丟棄隊列中最舊的任務并嘗試重新提交

線程池工作流程

  1. 提交任務時,如果當前線程數小于corePoolSize,創建新線程執行任務

  2. 如果線程數達到corePoolSize,新任務被放入工作隊列

  3. 如果工作隊列已滿且線程數小于maximumPoolSize,創建新線程執行任務

  4. 如果線程數達到maximumPoolSize且隊列已滿,觸發拒絕策略

代碼示例

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;public class ThreadPoolDemo {// 任務計數器private static AtomicInteger taskCount = new AtomicInteger(1);public static void main(String[] args) {// 創建線程池ThreadPoolExecutor executor = new ThreadPoolExecutor(2, // 核心線程數5, // 最大線程數60, // 空閑線程存活時間TimeUnit.SECONDS, // 時間單位new ArrayBlockingQueue<>(10), // 工作隊列(容量10)new CustomThreadFactory(), // 自定義線程工廠new ThreadPoolExecutor.CallerRunsPolicy() // 拒絕策略);// 提交20個任務for (int i = 0; i < 20; i++) {try {executor.execute(new Task("Task-" + i));} catch (RejectedExecutionException e) {System.out.println("任務被拒絕: " + i);}}// 關閉線程池executor.shutdown();}// 自定義任務static class Task implements Runnable {private String name;public Task(String name) {this.name = name;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " 執行 " + name);try {Thread.sleep(1000); // 模擬任務執行} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " 完成 " + name);}}// 自定義線程工廠static class CustomThreadFactory implements ThreadFactory {private AtomicInteger threadCount = new AtomicInteger(1);@Overridepublic Thread newThread(Runnable r) {Thread thread = new Thread(r, "CustomThread-" + threadCount.getAndIncrement());thread.setDaemon(false);thread.setPriority(Thread.NORM_PRIORITY);return thread;}}
}

常用預定義線程池

Java通過Executors類提供了幾種常用的線程池:

  1. newFixedThreadPool:固定大小線程池

  2. newCachedThreadPool:可緩存線程池

  3. newSingleThreadExecutor:單線程線程池

  4. newScheduledThreadPool:定時任務線程池

// 使用示例
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

注意事項

  1. 合理設置線程池大小,考慮CPU核心數和任務類型(I/O密集型或CPU密集型)

  2. 避免使用無界隊列,可能導致內存溢出

  3. 根據業務需求選擇合適的拒絕策略

  4. 使用自定義線程工廠便于問題排查和監控

  5. 正確關閉線程池,調用shutdown()或shutdownNow()

線程池是Java并發編程中的重要組件,合理使用可以顯著提高應用程序的性能和穩定性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95730.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95730.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95730.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

K8S 部署 NFS Dynamic Provisioning(動態存儲供應)

K8S 部署 NFS Dynamic Provisioning&#xff08;動態存儲供應&#xff09; 本文檔提供完整的 K8s NFS 動態存儲部署流程&#xff0c;包含命名空間創建、RBAC 權限配置、Provisioner 部署、StorageClass 創建及驗證步驟。 2. 部署步驟 2.1 創建命名空間 首先創建獨立的命名空間 …

JavaEE 進階第二期:開啟前端入門之旅(二)

專欄&#xff1a;JavaEE 進階躍遷營 個人主頁&#xff1a;手握風云 目錄 一、VS Code開發工具的搭建 1.1. 創建.html文件 1.2. 安裝插件 1.3. 快速生成代碼 二、HTML常見標簽 2.1. 換行標簽 2.2. 圖片標簽: img 2.3. 超鏈接 三、表格標簽 四、表單標簽 4.1. input標…

【RNN-LSTM-GRU】第二篇 序列模型原理深度剖析:從RNN到LSTM與GRU

本文將深入探討循環神經網絡&#xff08;RNN&#xff09;的核心原理、其面臨的長期依賴問題&#xff0c;以及兩大革命性解決方案——LSTM和GRU的門控機制&#xff0c;并通過實例和代碼幫助讀者徹底理解其工作細節。1. 引言&#xff1a;時序建模的數學本質在上一篇概述中&#x…

Qt---狀態機框架QState

QState是Qt狀態機框架&#xff08;Qt State Machine Framework&#xff09;的核心類&#xff0c;用于建模離散狀態以及狀態間的轉換邏輯&#xff0c;廣泛應用于UI交互流程、設備狀態管理、工作流控制等場景。它基于UML狀態圖規范設計&#xff0c;支持層次化狀態、并行狀態、歷史…

GitHub 熱榜項目 - 日榜(2025-09-02)

GitHub 熱榜項目 - 日榜(2025-09-02) 生成于&#xff1a;2025-09-02 統計摘要 共發現熱門項目&#xff1a;14 個 榜單類型&#xff1a;日榜 本期熱點趨勢總結 本期GitHub熱榜呈現AI Agent生態爆發趨勢&#xff0c;Koog、Activepieces等項目推動多平臺智能體開發框架成熟。語…

華為衛星對星引導技術深度解析:原理、實現與開源替代方案

利號&#xff1a;CNXXXXXX 涉及多傳感器融合/自適應波束成形/軌道預測算法一、技術原理剖析&#xff1a;衛星間高精度指向的核心挑戰在低軌衛星&#xff08;LEO&#xff09;星座中&#xff0c;衛星間鏈路&#xff08;ISL&#xff09;的建立面臨三大技術難題&#xff1a;1. 動力…

水下管道巡檢機器人結構設cad+三維圖+設計說明書

目 錄 1 緒論 1 1.1 選題的背景及意義 1 1.2 水下管道巡檢機器人的分類 2 1.2.1 管道巡檢技術的分類 2 1.2.2管道巡檢機器人的分類 2 1.3 研究的現狀 3 1.3.1 國內的研究現狀 3 1.3.2 國外的研究現狀 4 1.4 水下管道巡檢機器人的發展趨勢 5 1.…

[從零開始面試算法] (11/100) LeetCode 226. 反轉二叉樹:遞歸的“鏡像”魔法

引言 歡迎來到本系列的第十一篇&#xff01;在我們通過“最大深度”問題初步領略了樹的遞歸之美后&#xff0c;今天我們將面對一個更能體現遞歸“分治”思想的經典問題——LeetCode 226. 反轉二叉樹。 這道題在面試界的地位非同凡響&#xff0c;它因 Homebrew 的作者 Max How…

Java設計模式之創建型—建造者模式

Java中最常用的設計模式-CSDN博客 “把對象的構造步驟拆成鏈式方法&#xff0c;調用者按需填參&#xff0c;最后一次性 build&#xff0c;避免構造函數爆炸。” 經典場景 參數多&#xff08;>4 個&#xff09;且大部分可選 需要不可變對象&#xff08;final 字段&#xf…

網頁計時器,支持多計時器管理、數據分享、用戶數據同步、全屏展示等功能,可進行倒計時、正計時和顯示世界時鐘。

一個具有現代化 UI 和交互的計時器網頁應用&#xff0c;支持多計時器管理、數據分享、用戶數據同步、全屏展示等功能&#xff0c;可進行倒計時、正計時和顯示世界時鐘。它采用玻璃態設計和流暢動畫效果&#xff0c;提供極佳的視覺體驗。 特點&#xff1a; 支持多個計時器的創建…

紋理融合——用 TypeScript + Babylon.js 打造“可混合紋理序列”

我不想搞個一新的Shader&#xff0c;我就想用已有的材質&#xff08;比如StandardMaterial和PBRMetallicRoughnessMaterial&#xff09;實現紋理融合漸變等效果&#xff0c;于是我搞了一個TextureBlender。一、為什么重復造輪子&#xff1f;GPU 插值受限material.diffuseTextur…

【完整源碼+數據集+部署教程】公交車部件實例分割系統源碼和數據集:改進yolo11-fasternet

背景意義 隨著城市化進程的加快&#xff0c;公共交通系統的需求日益增加&#xff0c;公交車作為城市交通的重要組成部分&#xff0c;其運行效率和安全性直接影響到城市的交通狀況和居民的出行體驗。因此&#xff0c;公交車的維護和管理顯得尤為重要。在這一背景下&#xff0c;公…

【C++題解】關聯容器

關于set&#xff0c;map以及變種 |關聯容器| set&multiset | map&multimap |無序關聯容器| Unordered set&multiset | Unordered map&multimap | 建議先了解之后再配合練習 這次練習CCF真題比較多&#xff0c;也比較基礎&#xff0c;預計耗時不用這么久。 今天…

【智譜清言-GLM-4.5】StackCube-v1 任務訓練結果不穩定性的分析

1. Prompt 我是機器人RL方向的博士生正在學習ManiSkill&#xff0c;在學習時我嘗試使用相同命令訓練同一個任務&#xff0c;但是我發現最終的 success_once 指標并不是相同的&#xff0c;我感到十分焦慮&#xff0c; 我使用的命令如下&#xff1a; python sac.py --env_id&qu…

MySQL 8.0 主從復制原理分析與實戰

MySQL 8.0 主從復制原理分析與實戰半同步復制設計理念&#xff1a;復制狀態機——幾乎所有的分布式存儲都是這么復制數據的基于全局事務標識符&#xff08;GTID&#xff09;復制GTID工作原理多主模式多主模式部署示例課程目標&#xff1a; MySQL 復制&#xff08;Replication&a…

[UT]記錄case中seq.start(sequencer)的位置變化帶來的執行行為的變化

現象&#xff1a; 代碼選擇打開57行&#xff0c;注釋掉60行執行&#xff0c;結果58行不會打印。 代碼選擇打開60行&#xff0c;注釋57行執行&#xff0c;結果58行正常打印。 sequence的執行需要時間&#xff01;&#xff01;&#xff01; SV中代碼57行切換到60行的區別&#xf…

利用keytool實現https協議(生成自簽名證書)

利用keytool實現https協議&#xff08;生成自簽名證書&#xff09;什么是https協議&#xff1f;https&#xff08;安全超文本傳輸協議&#xff09;是 HTTP 的安全版本&#xff0c;通過 SSL/TLS 加密技術&#xff0c;在客戶端&#xff08;如瀏覽器&#xff09;和服務器之間建立加…

拆解 AI 大模型 “思考” 邏輯:從參數訓練到語義理解的核心鏈路

一、引言&#xff1a;揭開 AI 大模型 “思考” 的神秘面紗?日常生活中的 AI 大模型 “思考” 場景呈現&#xff08;如 ChatGPT 對話、AI 寫作輔助、智能客服應答&#xff09;?提出核心問題&#xff1a;看似具備 “思考” 能力的 AI 大模型&#xff0c;其背后的運作邏輯究竟是…

element plus 使用細節 (二)

接上一篇文章&#xff1a; element plus 使用細節 最近菜鳥忙于系統開發&#xff0c;都沒時間總結項目中使用的問題&#xff0c;幸好還是在空閑之余總結了一點&#xff08;后續也會來補充&#xff09;&#xff0c;希望能給大家帶來幫助&#xff01; 文章目錄table fixed 的 v…

【機器學習學習筆記】numpy基礎2

零基礎小白的 NumPy 入門指南如果你想用電競&#xff08;打游戲&#xff09;的思路理解編程&#xff1a;Python 是基礎操作鍵位&#xff0c;而 NumPy 就是 “英雄專屬技能包”—— 專門幫你搞定 “數值計算” 這類復雜任務&#xff0c;比如算游戲里的傷害公式、地圖坐標&#x…