java ThreadPoolExecutor 線程池

優點

ThreadPoolExecutor 提供了強大的靈活性和自定義參數的能力,可以根據實際需求來靈活配置線程池的行為。

位置

????????java.util.concurrent 包下

構造函數

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

核心參數

corePoolSize:線程池的基本大小,即使沒有任務執行時也保持存活的線程數。
maximumPoolSize:線程池所能容納的最大線程數(包括核心線程)。
keepAliveTime:非核心線程空閑等待新任務的最長時間,在這個時間內如果沒有新任務提交,那么非核心線程將會被終止。
unit:與keepAliveTime搭配使用的單位,如TimeUnit.SECONDS或TimeUnit.MILLISECONDS等。
workQueue:任務隊列,用于保存待處理的任務,可以是無界隊列(例如LinkedBlockingQueue)或有界隊列(例如ArrayBlockingQueue)。
threadFactory:創建新線程的工廠,默認使用Executors.defaultThreadFactory(),也可以自定義來設置線程名稱、優先級等屬性。
handler:拒絕策略,當線程池和工作隊列都已滿,無法接收新的任務時,會調用此策略進行處理。AbortPolicy(直接拋出異常);CallerRunsPolicy(由調用者線程自己執行任務);DiscardPolicy(直接丟棄新任務);DiscardOldestPolicy(丟棄隊列中最舊的任務并嘗試提交當前任務)。

線程池工作流程

當一個任務提交到ThreadPoolExecutor時:
如果當前運行的線程數量小于corePoolSize,則創建一個新的線程來執行任務。
若當前線程數等于corePoolSize但小于maximumPoolSize,且工作隊列已滿,則創建新的線程來執行任務。
如果線程數已經達到maximumPoolSize并且工作隊列也滿了,則根據RejectedExecutionHandler策略處理該任務。

線程池狀態

線程池具有五種狀態:RUNNING、SHUTDOWN、STOP、TIDYING 和 TERMINATED。
狀態轉換通常發生在調用諸如shutdown(), shutdownNow(), 或者所有任務完成后

重要方法

shutdown():線程池不再接受新的任務,但會繼續處理已經提交的任務。
shutdownNow():嘗試停止所有正在執行的任務,并返回尚未開始執行的任務列表。
execute(Runnable command):提交一個Runnable任務給線程池執行。
submit(Callable<T> task):提交一個Callable任務,能夠返回結果。
awaitTermination(long timeout, TimeUnit unit):阻塞當前線程,直到線程池關閉或者超時發生。
isTerminated():檢查線程

示例

? ? ? ? 示例1:

package org.springblade.test;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;@Slf4j
public class Test {@org.junit.jupiter.api.Testpublic void ThreadPoolExecutorExample() {// 自定義線程工廠ThreadFactory namedThreadFactory = new NamedThreadFactory();// 創建有界任務隊列BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(10);// 定義拒絕策略RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();// 創建線程池ThreadPoolExecutor executor = new ThreadPoolExecutor(2, // 核心線程數4, // 最大線程數60L, // 空閑線程存活時間(單位:秒)TimeUnit.SECONDS, // 時間單位workQueue, // 工作隊列namedThreadFactory, // 線程工廠handler // 拒絕策略);// 提交任務到線程池for (int i = 0; i < 20; i++) {final int taskId = i;Runnable worker = new Runnable() {@Overridepublic void run() {System.out.println("Task " + taskId + " is running by " + Thread.currentThread().getName());try {Thread.sleep(500); // 模擬耗時操作} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Task " + taskId + " finished");}};executor.execute(worker);}// 關閉線程池executor.shutdown();while (!executor.isTerminated()) {// 等待所有任務執行完畢}System.out.println("所有任務已完成,線程池已關閉");}
}/*** 定義線程創建邏輯,設置線程名稱前綴等*/
class NamedThreadFactory implements ThreadFactory {private static final AtomicInteger poolNumber = new AtomicInteger(1);private final ThreadGroup group;private final AtomicInteger threadNumber = new AtomicInteger(1);private final String namePrefix;NamedThreadFactory() {SecurityManager s = System.getSecurityManager();group = (s != null) ? s.getThreadGroup() :Thread.currentThread().getThreadGroup();namePrefix = "MyTaskPool-" + poolNumber.getAndIncrement() + "-thread-";}@Overridepublic Thread newThread(Runnable r) {Thread t = new Thread(group, r,namePrefix + threadNumber.getAndIncrement(),0);if (t.isDaemon())t.setDaemon(false);if (t.getPriority() != Thread.NORM_PRIORITY)t.setPriority(Thread.NORM_PRIORITY);return t;}
}
//我們提交了20個任務到線程池。由于工作隊列容量有限(10),當隊列滿后會嘗試增加線程直到達到最大線程數(4)。
//如果在達到最大線程數后仍有新的任務提交,將根據指定的拒絕策略處理這些任務。
// 在本例中,我們選擇了 CallerRunsPolicy,這意味著超出線程池處理能力的任務將會由調用者線程(主線程)直接執行。
//執行結果
//Task 0 is running by MyTaskPool-1-thread-1
// Task 14 is running by main
// Task 1 is running by MyTaskPool-1-thread-2
// Task 13 is running by MyTaskPool-1-thread-4
// Task 12 is running by MyTaskPool-1-thread-3
// Task 12 finished
// Task 1 finished
// Task 0 finished
// Task 13 finished
// Task 14 finished
// Task 4 is running by MyTaskPool-1-thread-3
// Task 19 is running by main
// Task 5 is running by MyTaskPool-1-thread-4
// Task 3 is running by MyTaskPool-1-thread-1
// Task 2 is running by MyTaskPool-1-thread-2
// Task 5 finished
// Task 4 finished
// Task 19 finished
// Task 3 finished
// Task 8 is running by MyTaskPool-1-thread-1
// Task 2 finished
// Task 9 is running by MyTaskPool-1-thread-2
// Task 7 is running by MyTaskPool-1-thread-3
// Task 6 is running by MyTaskPool-1-thread-4
// Task 8 finished
// Task 10 is running by MyTaskPool-1-thread-1
// Task 6 finished
// Task 9 finished
// Task 7 finished
// Task 15 is running by MyTaskPool-1-thread-2
// Task 11 is running by MyTaskPool-1-thread-4
// Task 16 is running by MyTaskPool-1-thread-3
// Task 10 finished
// Task 17 is running by MyTaskPool-1-thread-1
// Task 11 finished
// Task 15 finished
// Task 16 finished
// Task 18 is running by MyTaskPool-1-thread-4
// Task 17 finished
// Task 18 finished
// 所有任務已完成,線程池已關閉

????????示例2:

package org.springblade.test;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;@Slf4j
public class Test {@org.junit.jupiter.api.Testpublic void ThreadPoolExecutorExample() {// 定義核心線程數、最大線程數、空閑線程存活時間以及時間單位int corePoolSize = 5;int maximumPoolSize = 10;long keepAliveTime = 60; // 60秒TimeUnit unit = TimeUnit.SECONDS;// 創建一個有界的LinkedBlockingQueue作為任務隊列,容量為20BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(20);// 創建線程池ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue);// 提交任務到線程池for (int i = 0; i < 30; i++) {final int taskId = i;Runnable worker = () -> {System.out.println("Task " + taskId + " is running by " + Thread.currentThread().getName());try {Thread.sleep(1000); // 模擬耗時操作} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Task " + taskId + " finished");};executor.execute(worker);}// 關閉線程池(這里沒有立即關閉,而是等待所有任務執行完畢)executor.shutdown();while (!executor.isTerminated()) {// 等待所有任務執行完畢}System.out.println("所有任務已完成,線程池已關閉");}
}//執行結果
// Task 0 is running by pool-1-thread-1
// Task 1 is running by pool-1-thread-2
// Task 3 is running by pool-1-thread-4
// Task 2 is running by pool-1-thread-3
// Task 4 is running by pool-1-thread-5
// Task 25 is running by pool-1-thread-6
// Task 26 is running by pool-1-thread-7
// Task 27 is running by pool-1-thread-8
// Task 29 is running by pool-1-thread-10
// Task 28 is running by pool-1-thread-9
// Task 2 finished
// Task 0 finished
// Task 3 finished
// Task 5 is running by pool-1-thread-1
// Task 6 is running by pool-1-thread-4
// Task 7 is running by pool-1-thread-3
// Task 1 finished
// Task 8 is running by pool-1-thread-2
// Task 4 finished
// Task 9 is running by pool-1-thread-5
// Task 25 finished
// Task 10 is running by pool-1-thread-6
// Task 27 finished
// Task 28 finished
// Task 26 finished
// Task 13 is running by pool-1-thread-7
// Task 29 finished
// Task 14 is running by pool-1-thread-10
// Task 11 is running by pool-1-thread-8
// Task 12 is running by pool-1-thread-9
// Task 7 finished
// Task 15 is running by pool-1-thread-3
// Task 5 finished
// Task 16 is running by pool-1-thread-1
// Task 6 finished
// Task 17 is running by pool-1-thread-4
// Task 8 finished
// Task 18 is running by pool-1-thread-2
// Task 9 finished
// Task 19 is running by pool-1-thread-5
// Task 10 finished
// Task 20 is running by pool-1-thread-6
// Task 12 finished
// Task 21 is running by pool-1-thread-9
// Task 14 finished
// Task 11 finished
// Task 22 is running by pool-1-thread-8
// Task 23 is running by pool-1-thread-10
// Task 13 finished
// Task 24 is running by pool-1-thread-7
// Task 15 finished
// Task 17 finished
// Task 16 finished
// Task 18 finished
// Task 19 finished
// Task 20 finished
// Task 23 finished
// Task 22 finished
// Task 24 finished
// Task 21 finished

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

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

相關文章

進程與線程:通過實際生活來解析計算機的基本運作單位

進程與線程 進程與線程&#xff1a;詳細解析計算機的基本運作單位1. 進程&#xff1a;獨立的執行環境1.1 進程的特點&#xff1a; 2. 線程&#xff1a;輕量級的執行單元2.1 線程的特點&#xff1a; 3. 區別和聯系4. 表格 進程與線程&#xff1a;詳細解析計算機的基本運作單位 在…

Unity鉸鏈四桿機構設計和運動仿真

一、效果圖 設定好各邊長度和轉速后&#xff0c;點擊【設置并啟動】&#xff0c;自動生成一個機構模型&#xff0c;并按照原理進行運轉 二、鉸鏈四桿機構介紹 機架&#xff1a;A和D是固定位置&#xff0c;叫做機架。 曲柄&#xff1a;B點繞A點旋轉&#xff0c;構成曲柄。 連…

990-22產品經理:The benefits of business analytics 業務分析的優勢

Turning data into pound isn’t just something for big corporations now. Thanks to relatively inexpensive software and easy-to-use, drag-and-drop tools, pulling data and analysing it – with the goal of growing your business – has never been more uncomplic…

英語學習資源分享

鍵盤俠的單詞記憶軟件&#xff1a; Qwerty Learner — 為鍵盤工作者設計的單詞與肌肉記憶鍛煉軟件https://qwerty.kaiyi.cool/ 經濟學人、紐約客等英語外刊雜志下載&#xff1a;若github無法進入可以試試下載VPN插件&#xff08;在瀏覽器中安裝免費的VPN插件&#xff0c;個人推…

重拾C++之菜鳥刷算法第4篇---哈希表

一些理論知識 哈希函數是一種映射關系&#xff0c;根據關鍵詞key&#xff0c;經過一定函數關系得到元素的位置。 常見的哈希函數構造方法 直接定址法 除留余數法 疊加法 隨機數法 哈希沖突 不同關鍵字通過相同哈希函數計算出相同的哈希地址&#xff0c;該種現象稱為哈希…

視頻匯聚/存儲/壓縮/診斷平臺EasyCVR視頻聯網整合方案應用特點

隨著科技的不斷發展&#xff0c;監控視頻在各個領域的應用越來越廣泛。為了更好地管理和利用這些視頻資源&#xff0c;視頻聯網與整合的需求也越來越多。通過視頻聯網技術將不同地理位置或不同設備的視頻資源進行整合&#xff0c;實現實時共享和集中管理。視頻聯網整合方案的應…

6、云原生安全之falco的規則解讀(部分)(下)

文章目錄 3、規則解析記錄3.21、檢測是否有非特權用戶成功執行userfaultfd系統調用3.22、監控容器內通過curl/wget的下載行為3.23、檢測容器內修改release_agent文件的場景(無論修改成功與否)3.24、檢測Java進程通過網絡加載class類文件的行為,該規則用于檢測log4j的應急3.2…

Linux運維_Bash腳本_編譯安裝GNU-Tools

Linux運維_Bash腳本_編譯安裝GNU-Tools Bash (Bourne Again Shell) 是一個解釋器&#xff0c;負責處理 Unix 系統命令行上的命令。它是由 Brian Fox 編寫的免費軟件&#xff0c;并于 1989 年發布的免費軟件&#xff0c;作為 Sh (Bourne Shell) 的替代品。 您可以在 Linux 和 …

2024最新算法:鸚鵡優化算法(Parrot optimizer,PO)求解23個基準函數

一、鸚鵡優化算法 鸚鵡優化算法&#xff08;Parrot optimizer&#xff0c;PO&#xff09;由Junbo Lian等人于2024年提出的一種高效的元啟發式算法&#xff0c;該算法從馴養的鸚鵡中觀察到的覓食、停留、交流和對陌生人行為的恐懼中汲取靈感。這些行為被封裝在四個不同的公式中…

C++_紅黑樹

目錄 1、紅黑樹的規則 2、紅黑樹節點的定義 3、紅黑樹插入節點的調整操作 3.1 情況一 3.2 情況二 3.3 情況三 4、紅黑樹的實現 結語 前言&#xff1a; 在C中&#xff0c;紅黑樹是二叉搜索樹的另一種優化版本&#xff0c;他與AVL樹的區別在于保持樹的平衡方式不同&…

【Mysql】Navicat數據庫勿刪了mysql.infoschema@localhost,導致打不開數據庫,如何修改

運行報錯如下&#xff1a; 1449 . The user specified as a definer (mysql.infoschemaocalhost) does not exist該方法不需要重啟mysql&#xff0c;或者重裝&#xff1b;僅需要恢復刪除的mysql.infoschemalocalhost用戶 一、登錄建立用戶 mysql -uroot -pxxxxxx密碼二、建立…

【網上商城系統的設計與開發】

目錄 1.實訓概況 1 1.1 實訓題目 1 1.2實訓時間 1 1.3實訓目的 1 1.4 實訓環境 1 1.5 實訓內容 2 1.6 進度安排 3 2.需求分析 5 2.1 功能需求分析 5 2.1.1用戶需求分析 5 2.2.2網站前臺需求 5 2.2.3網站后臺需求 6 2.2 可行性分析 7 2.2.1社會可行性 7 2.2.2技術可行性 8 3.系統…

Sora學習(一):Sora技術路徑整體認知

前文&#xff1a;最近跟著DataWhale組隊學習這一期“Sora原理與技術實戰”&#xff0c;本篇博客主要是基于DataWhale成員、廈門大學平潭研究院楊知錚研究員分享的Sora技術原理詳解課件內容以及參考網上一些博客資料整理而來&#xff08;詳見文末參考文獻&#xff09;&#xff0…

【談一談】并發編程_鎖的分類

【談一談】并發編程_鎖的分類 Hello!~大家好!~每天進步一點點,日復一日,我們終將問劍頂峰 這里主要是介紹下我們常用的鎖可以分為幾類,目的是整體框架作用~方便后續的并發文章 說白了,這篇就是開頭哈~ 本文總綱: 一.可重入鎖和不可重入鎖 我們開發中一般用到的都是可重入鎖比如…

Photoshop 2023:重塑創意,引領數字藝術新紀元

在數字藝術的浩瀚星空中&#xff0c;Adobe Photoshop 2023&#xff08;簡稱PS 2023&#xff09;如同一顆璀璨的新星&#xff0c;為Mac和Windows用戶帶來了前所未有的創意體驗。這款強大的圖像處理軟件不僅繼承了前作的精髓&#xff0c;更在細節上進行了諸多創新&#xff0c;讓每…

運行Python文件時出現‘utf-8’code can‘t decode byte 如何解決?(如圖)

如圖 亦或者出現“SyntaxError: Non-UTF-8 code starting with \xbb ” 出現這種問題往往是編碼格式導致的&#xff0c;我們可以在py文件中的第一行加入以下代碼&#xff1a; # codingutf-8或者 # codinggdk優先使用gbk編碼 解釋一下常用的兩種編碼格式&#xff1a; utf-…

朱維群將出席用碳不排碳碳中和頂層科技路線設計開發

演講嘉賓&#xff1a;朱維群 演講題目&#xff1a;“用碳不排碳”碳中和頂層科技路線設計開發 簡介 姓名&#xff1a;朱維群 性別&#xff1a;男 出生日期&#xff1a;1961-09-09 職稱&#xff1a;教授 1998年畢業于大連理工大學精細化工國家重點實驗室精細化工專業&…

什么是B+樹,和B樹有什么不同?

&#x1f449;博主介紹&#xff1a; 博主從事應用安全和大數據領域&#xff0c;有8年研發經驗&#xff0c;5年面試官經驗&#xff0c;Java技術專家&#xff0c;WEB架構師&#xff0c;阿里云專家博主&#xff0c;華為云云享專家&#xff0c;51CTO 專家博主 ?? 個人社區&#x…

Spring Initializer環境問題

1.基于jdk8與本地 環境準備 1)下載jdk8并安裝 2&#xff09;下載maven 3.6.3并解壓放入D盤maven目錄下&#xff0c;去掉外層 設置阿里源 打開settings.xml,在mirrors標簽之內增加&#xff0c;注意粘貼后</id>中的/有可能被刪掉&#xff0c;要自己補上 <mirror>&l…

健身房預約小程序制作詳細步驟解析

如果你是一位健身愛好者&#xff0c;或者是一位健身教練&#xff0c;你一定知道預約健身的痛苦。傳統的預約方式不僅麻煩&#xff0c;而且效率低下。但是&#xff0c;現在&#xff0c;我們可以使用一種神仙工具——喬拓云網&#xff0c;來搭建一個屬于自己的健身預約小程序&…