Java SE入門及基礎(62) 線程池 執行器

線程池

1. 執行器

????????In all of the previous examples, there's a close connection between the task being done by a new thread, as defined by its Runnable object, and the thread itself, as defined by a Thread object. This works well for small applications, but in large-scale applications, it makes sense to separate thread management and creation from the rest of the application. Objects that encapsulate these functions are known as executors.
????????在前面的所有示例中,由新線程(由其Runnable 對象定義)執行的任務與由 Thread 對象定義的線程本身之間存在緊密的聯系。 這對于小型應用程序非常有效,但是在大型應用程序中,將線程管理和創建與其余應用程序分開是有意義的。 封裝這些功能的對象稱為執行器。
Executor接口方法
void execute ( Runnable command ); // 將任務添加到線程池中,等待線程池調度執行
ExecutorService接口常用方法
void shutdown (); // 有序關閉線程池,不再接收新的線程任務,但池中已有任務會執行
List < Runnable > shutdownNow (); // 關閉線程池,嘗試停止所有正在執行的任務,并將池中等待執行的任務返回
boolean isShutdown (); // 檢測線程池是否已經關閉
boolean isTerminated (); // 檢測線程池是否已經終止
Future <?> submit ( Runnable task ); // 提交一個任務至線程池中

2.線程池

????????Most of the executor implementations in java.util.concurrent use thread pools, which consist of worker threads. This kind of thread exists separately from the Runnable and Callable tasks it executes and is often used to execute multiple tasks.
????????java.util.concurrent中的大多數執行程序實現都使用線程池,該線程池由工作線程組成。這種線程與它執行的Runnable Callable 任務分開存在,通常用于執行多個任務。
????????Using worker threads minimizes the overhead due to thread creation. Thread objects use a significant amount of memory, and in a large-scale application, allocating and deallocating many thread objects creates a significant memory management overhead.
????????使用工作線程可以最大程度地減少線程創建所帶來的開銷。線程對象占用大量內存,在大型應用程序中,分配和取消分配許多線程對象會產生大量內存管理開銷。
????????One common type of thread pool is the fixed thread pool. This type of pool always has a specified number of threads running; if a thread is somehow terminated while it is still in use, it is automatically replaced with a new thread. Tasks are submitted to the pool via an internal queue, which holds extra tasks whenever there are more active tasks than threads.
????????線程池的一種常見類型是固定線程池。這種類型的池始終具有指定數量的正在運行的線程。如果某個線程在仍在使用時以某種方式終止,則它將自動替換為新線程。任務通過內部隊列提交到池中,該內部隊列在活動任務多于線程時容納額外的任務。
????????An important advantage of the fixed thread pool is that applications using it degrade gracefully.
????????固定線程池的一個重要優點是使用該線程池的應用程序可以正常降級
線程池構造方法
public ThreadPoolExecutor ( int corePoolSize , // 核心線程數
int maximumPoolSize , // 最大線程數
long keepAliveTime , // 工作線程存活時間
TimeUnit unit , // 時間單位
BlockingQueue < Runnable > workQueue , // 任務隊列
ThreadFactory threadFactory , // 線程工廠
RejectedExecutionHandler handler ) // 拒絕處理器
示例
import java.util.Queue;
import java.util.concurrent.*;
public class ThreadPoolTest {public static void main(String[] args) {LinkedBlockingDeque<Runnable> taskQueue = new LinkedBlockingDeque<>(10);ThreadPoolExecutor pool = new ThreadPoolExecutor(5, //核心線程數10, //最大工作線程數2,//非核心線程的工作線程存活時間TimeUnit.SECONDS,//存活時間單位taskQueue,//任務隊列Executors.defaultThreadFactory(),//線程池中的線程創建工廠new ThreadPoolExecutor.AbortPolicy());//拒絕新線程任務的策略for(int i=0; i<30; i++){pool.submit(new ThreadPoolTask(i));int corePoolSize = pool.getCorePoolSize();//獲取核心線程數int size = pool.getQueue().size(); //獲取隊列中任務個數long finish = pool.getCompletedTaskCount();//獲取線程池執行完成任務的個數System.out.printf("線程池中核心線程數:%d,隊列中任務個數:%d,線程池完成任務數:%d\n",corePoolSize, size, finish);try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}}pool.shutdown();//關閉線程池,等待線程池中的任務執行完成,但是不會接收新的線程任務}static class ThreadPoolTask implements Runnable{private int num;public ThreadPoolTask(int num) {this.num = num;}@Overridepublic void run() {System.out.println("正在執行線程任務" + num);try {Thread.sleep(400);} catch (InterruptedException e) {e.printStackTrace();}}}
}
線程池工作流程
????????線程池啟動后,核心線程就已經啟動,當一個新的任務提交到線程池時,首先會檢測當前是否存在空閑的核心線程,如果存在,就將該任務交給這個空閑核心線程執行。如果不存在,那么就將該任務交給隊列,在隊列中排隊等候。如果隊列滿了,此時線程池會檢測當前工作線程數是否達到最大線程數,如果沒有達到最大線程數,那么將由線程工廠創建新的工作線程來執行隊列中的任務,這樣,隊列中就有空間能夠容納這個新任務。如果創建的工作線程在執行完任務后,在給定的時間范圍內沒有新的任務執行,這些工作線程將死亡。如果已經達到最大線程數,那么線程池將采用提供的拒絕處理策略來拒絕這個新任務。
線程池創建方式
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecutorTest {public static void main(String[] args) {
//創建一個給定核心線程數以及最大線程數的線程池,該線程池隊列非常大ExecutorService pool1 = Executors.newFixedThreadPool(5);
//創建只有一個核心線程數以及最大線程數的線程池,該線程池隊列非常大ExecutorService pool2 = Executors.newSingleThreadExecutor();
//創建一個核心線程為0,最大線程數為整數的最大值的可緩存的線程池ExecutorService pool3 = Executors.newCachedThreadPool();
//創建一個給定核心線程數,最大線程數為整數的最大值的可調度的線程池ExecutorService pool4 = Executors.newScheduledThreadPool(5);}
}

3. 線程池的使用

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ExecutorTaskTest {public static void main(String[] args) {ExecutorService service = Executors.newFixedThreadPool(5);for (int i = 0; i < 100; i++) {int order = i;service.submit(() -> System.out.println("正在執行任務" + order));}service.shutdown();}
}

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

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

相關文章

Golang | Leetcode Golang題解之第212題單詞搜索II

題目&#xff1a; 題解&#xff1a; type Trie struct {children map[byte]*Trieword string }func (t *Trie) Insert(word string) {node : tfor i : range word {ch : word[i]if node.children[ch] nil {node.children[ch] &Trie{children: map[byte]*Trie{}}}nod…

Zynq系列FPGA實現SDI視頻編解碼,基于GTX高速接口,提供5套工程源碼和技術支持

目錄 1、前言工程概述免責聲明 2、相關方案推薦本博已有的 SDI 編解碼方案本方案在Xilinx--Kintex系列FPGA上的應用 3、詳細設計方案設計原理框圖SDI 輸入設備Gv8601a 均衡器GTX 解串與串化SMPTE SD/HD/3G SDI IP核BT1120轉RGB圖像緩存視頻讀取控制HDMI輸出RGB轉BT1120Gv8500 驅…

vuepress使用簡介及個人博客搭建

目錄 一、介紹二、環境準備三、安裝運行vuepress四、目錄結構五、配置文件六、導航欄配置七、導航欄logo八、瀏覽器圖標九、側邊欄配置十、添加 Git 倉庫和編輯鏈接十一、部署到GitHub十二、搭建成功 一、介紹 VuePress 是 Vuejs 官方提供的一個是Vue驅動的靜態網站生成器&…

Qt 配置ASan

Qt 配置ASan 文章目錄 Qt 配置ASan摘要關于ASan&#xff08;AddressSanitizer&#xff09;在Qt中配置 ASan1. 安裝必要的工具2. 修改項目的 .pro 文件3. 重新構建項目4. 運行應用程序5. 分析錯誤報告示例注意事項 關鍵字&#xff1a; Qt、 ASan、 AddressSanitizer 、 GCC …

CTFHUB-SSRF-Redis協議

本題需要用到&#xff1a; 在線編碼網址&#xff1a;https://icyberchef.com/ gopherus工具&#xff1a;https://mp.csdn.net/mp_blog/creation/editor/139440201 開啟題目&#xff0c;頁面空白 和上一個題FastCGI協議一樣&#xff0c;還是使用gopherus攻擊redis ./gopheru…

Oracle PL / SQL 插入insert 第二部分

DUAL表 dual是由具有一列和一行的oracle數據庫&#xff08;所有者SYS&#xff09;擁有的表。 要評估1 1的添加&#xff0c;請執行以下SQl SELECT語句&#xff1a; SELECT 1 1 FROM dual; 快速找出oracle如何評估你對內置函數length&#xff08;&#xff09;的使用。 SELE…

vlan基礎相關

7.2以太網交換基礎 數據鏈路層也叫2層網絡&#xff0c;用的是Mac地址&#xff0c;想到Mac地址就要想到交換機。 以太網協議&#xff08;LAN&#xff09;以太網是建立在CSMA/CD載波監聽多路訪問/沖突檢測&#xff0c;機制上的廣播型網絡。CSMA工作原理是先監聽&#xff0c;在介…

110kV以下變電所電力監控-安科瑞電力監控解決方案

一、系統介紹 變電站電力監控系統為110kV及以下用戶變電站提供了完整的SCADA功能。 二、系統硬件 AM5SE系列微機保護裝置 全電參量測量 諧波制動獨立操作回路 可編程出口矩陣&#xff1b;定制化的邏輯設計&#xff1b;故障錄波&#xff1b;事件記錄、故障 錄波數據&#x…

在UniApp中使用Three.js渲染3D模型

在移動應用開發中,3D渲染正變得越來越普遍。本文將介紹如何在UniApp框架中集成Three.js庫來渲染3D模型,為您的應用增添引人注目的視覺效果。 1. 簡介 UniApp是一個跨平臺開發框架,允許開發者使用Vue.js開發一次,就能發布到iOS、Android、Web等多個平臺。Three.js則是一個強大…

3099. 哈沙德數 Easy

如果一個整數能夠被其各個數位上的數字之和整除&#xff0c;則稱之為 哈沙德數&#xff08;Harshad number&#xff09;。給你一個整數 x 。如果 x 是 哈沙德數 &#xff0c;則返回 x 各個數位上的數字之和&#xff0c;否則&#xff0c;返回 -1 。 示例 1&#xff1a; 輸入&a…

高內聚低耦合舉個例子詳細介紹

學習目標&#xff1a; 高內聚低耦合舉個例子詳細介紹 學習內容&#xff1a; 高內聚和低耦合是軟件設計中的兩個重要原則&#xff0c;旨在提高系統的可維護性、可擴展性和靈活性。下面我們通過一個例子詳細介紹高內聚和低耦合的概念及其實現方法。 例子&#xff1a;在線購物系…

聊天交友系統開發專業語聊交友app開發搭建同城交友開發婚戀交友系統相親app開發

1、上麥相親互動:直播間內除了紅娘外&#xff0c;還有男女用戶兩個視頻麥位&#xff0c;直播間符合要求的用戶可以申請上麥 2、公屏聊天:為上麥用戶可以通過在公屏發言的方式參與直播間內的話題互動。 3、私信,異性用戶之間可以發送私信消息&#xff0c;通過付費或開通會員可解…

法國工程師IMT聯盟 密碼學及其應用 2023年期末考試補考題

1 JAVA 安全 1.1 問題1 1.1.1 問題 用 2 或 3 句話解釋 Java 執行模型&#xff08;Java 虛擬機machine virtuelle Java)&#xff09;中引入introduit沙箱bac sable機制 mcanisme d’excution par isolation的目的。 1.1.2 問題解釋 在 Java 執行模型&#xff08;Java 虛擬機…

知識見聞 - 什么是SAT求解器

SAT求解器&#xff08;SAT solver&#xff0c;布爾可滿足性問題求解器&#xff09;是一種計算工具&#xff0c;用于確定是否存在一個變量賦值&#xff0c;使給定的布爾公式為真。布爾可滿足性問題是計算理論中的一個重要問題&#xff0c;通常用來解決邏輯推理、驗證和優化問題。…

Java面試八股文

一、Redis 1. 使用場景 &#xff08;1&#xff09;Redis的數據持久化策略有哪些 RDB&#xff1a;全稱Redis Database Backup file&#xff08;Redis數據備份文件&#xff09;&#xff0c;也被叫作Redis數據快照。簡單來說就是把內存中的所有數據都記錄到磁盤中。當Redis實例故…

【信息系統項目管理師】18年~23年案例概念型知識

文章目錄 18上18下19上19下20上20下21上21下22年上22年下23年上 18上 請簡述 ISO 9000 質量管理的原則 領導作用、 過程方法、 管理的系統方法、 與供方互利的關系、 基于事實的決策方法、 持續改進、 全員參與、 以顧客為關注焦點 概念 國家標準(GB/T 1 9000 2008)對質量的定…

JS如何把年月日轉為時間戳

在JavaScript中&#xff0c;將年月日&#xff08;通常表示為一個字符串或者分別的年、月、日數字&#xff09;轉換為時間戳&#xff08;即Unix時間戳&#xff0c;是自1970年1月1日&#xff08;UTC/GMT的午夜&#xff09;開始所經過的秒數&#xff0c;不考慮閏秒&#xff09;可以…

【proteus經典實戰】VB上位機程序控制DS1302時鐘的proteus仿真

一、簡介&#xff1a; VB上位機程序控制DS1302時鐘是一種常見的應用&#xff0c;DS1302是一款實時時鐘芯片&#xff0c;通常用于計算機、電子設備或其他系統中&#xff0c;以提供時間戳和其他時間相關功能&#xff0c;DS1302時鐘芯片通常需要外部電源供電&#xff0c;并且具有…

嵌入式c語言2——預處理

在c語言中&#xff0c;頭部內容&#xff0c;如include與define是不參與編譯而直接預先處理的 如include相當于把頭文件擴展&#xff0c;define相當于做了替換 c語言大型工程創建時&#xff0c;會有調試版本與發行版本&#xff0c;發行時不希望看到調試部分內容&#xff0c;此時…

基于多視點編碼光場的全景三維重建方法

歡迎關注GZH《光場視覺》 摘要&#xff1a;在基于光場的一系列應用中&#xff0c;目標的三維重建是基礎且關鍵的任務。普通光場只能重建單一視角而無法重建全景&#xff0c;并且在紋理特征匱乏的區域也無法生成準確的三維信息。針對以上問題&#xff0c;提出一種基于多視點編碼…