JavaEE——線程池

目錄

  • 前言
  • 1. 概念
  • 2. 線程池相關參數
  • 3. Executors的使用
  • 總結

前言

線程是為了解決進程太重的問題,操作系統中進程的創建和銷毀需要較多的系統資源,用了輕量級的線程來代替部分線程,但是如果線程創建和銷毀的頻率也開始提升到了一定程度,系統的開銷同樣也不可忽視了,為了解決這種問題,我們使用了線程池進行優化。本篇文章就主要來講講線程池。

1. 概念

我們提前把線程創建好,放到一個”池子“里,這就構成了一個線程池,我們在申請線程時,直接從這個所謂的池子里取,用完了之后再放回去,這就是線程池的基本思想,很好的減小了創建和銷毀的線程的開銷。

2. 線程池相關參數

這里主要介紹一下線程池構造方法中的相關參數。
Java中提供了線程池的類:ThreadPoolExecutor,在創建這個類的實例時,有很多參數,這里來簡要介紹一下:

在這里插入圖片描述
官方文檔中,有這四種構造方式,我們介紹第四個,其中包含了前三個的參數。
在這里插入圖片描述
我們先看前兩個參數:
在這里插入圖片描述
第一個表示核心線程數,第二個表示總數。
在Java的線程池中,把線程分為兩種:核心線程和臨時線程,一創建就申請的線程是核心線程,將任務交給核心線程。若核心線程被占用滿,處理不過來,就會申請一些臨時的線程來進行“協助”,當空閑下來時,這些臨時線程被釋放,但是核心線程不會被釋放。
接下來看:
在這里插入圖片描述
這里第一個表示線程的存活時間,第二個表示時間單位。
通過這兩個參數,來設定臨時線程的存活時間。

接下來:
在這里插入圖片描述
這里的參數是一個阻塞隊列,存放著線程池的任務隊列, 線程池就是從這個隊列中取出任務,分配給其創建的線程。

繼續看下一個參數:
在這里插入圖片描述
這是一個線程工廠,這里的線程工廠使用了工廠設計模式,這是眾多設計模式中很常見的一種,工廠模式用于彌補構造方法里存在的缺陷,比如說在創建多個構造方法的時候,如果參數的數量一致,那么參數的類型需要不同,但是實際中常常需要上述創建這種情況的構造方法,這里的參數含義不同,但是類型和數量卻是一致,這樣構造會編譯出錯。
所以為了解決這種問題,我們就引用了工廠設計模式,在這個設計模式里,我們不用構造方法來初始化對象,使用靜態方法來初始化對象,即創建一個工廠類,在里面構造靜態方法,來間接的達到創建對象的目的。
回到線程工廠,我們使用這個線程工廠,則是用來對線程池所創建出來的線程進行初始化的設定。

下面看最后一個參數:
在這里插入圖片描述
此參數叫做拒絕策略,當線程池的任務隊列滿的時候,如果再次添加新任務,則會根據給出的拒絕策略來進行處理,文檔提供了四種拒絕策略。
在這里插入圖片描述
第一個叫做直接終止,即拋出異常,終止程序。
第二個是讓調用者自己來執行任務。
第三個是丟棄隊列中最老任務。
第四個是丟棄隊列中最新任務。

3. Executors的使用

Executors是標準庫中提供的一個線程池的簡化版本,即對ThreadPoolExecutot進行了封裝。
我們可以使用Executor來創建一些線程池:
在這里插入圖片描述
可以看到這里有各種各樣的線程池。
下面介紹四個常用的:

    public static void main(String[] args) {//固定線程數目的線程池,核心線程和最大線程數都是4ExecutorService service =  Executors.newFixedThreadPool(4);//核心線程數為0,最大線程數為Integer.MAX_VALUE的線程池ExecutorService service2 =  Executors.newCachedThreadPool();// 只有一個線程的線程池,核心線程數和最大線程數都是1ExecutorService service3 =  Executors.newSingleThreadExecutor();// “定時器”,核心線程數為0,最大線程數為10的線程池,在這個線程池的任務可以在一定時間后執行或定期執行ExecutorService service4 =  Executors.newScheduledThreadPool(10);}

一般來說我們使用最多的線程池是前兩個,接下來展示如何添加任務:

        for (int i = 0; i < 100; i++) {int id = i;service.submit( new Runnable(){@Overridepublic void run() {System.out.println("線程池中的線程正在執行任務" + id);}});}

運行效果:
在這里插入圖片描述

總結

以上是對線程池的一些基本介紹,希望能夠讓大家了解Java中線程池各參數的作用并且能夠使用Executors創建常見的線程池。

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

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

相關文章

3 c++提高——STL常用容器(一)

目錄 1 string容器 1.1 string基本概念 1.2 string構造函數 1.3 string賦值操作 1.4 string字符串拼接 1.5 string查找和替換 1.6 string字符串比較 1.7 string字符存取 1.8 string插入和刪除 1.9 string子串 2 vector容器 2.1 vector基本概念 2.2 vector構造函數…

手把手教你用【Go】語言調用DeepSeek大模型

1、首先呢&#xff0c;點擊 “DeepSeek”” 這個&#xff0c; 可以充1塊玩玩。 2、然后獲取api-key 3、替換apiKey const (apiURL "https://api.deepseek.com/v1/chat/completions"apiKey "your api key" // 替換為你的實際 API KeymodelName &…

自動化UI測試工具TestComplete的核心功能及應用

對桌面應用穩定性與用戶體驗的挑戰&#xff0c;手動測試效率低、覆蓋有限&#xff0c;而普通自動化工具常難以應對復雜控件識別、腳本靈活性和大規模并行測試的需求。 自動化UI測試工具TestComplete憑借卓越的對象識別能力、靈活的測試創建方式以及高效的跨平臺并行執行功能&a…

【C/C++】邁出編譯第一步——預處理

【C/C】邁出編譯第一步——預處理 在C/C編譯流程中&#xff0c;預處理&#xff08;Preprocessing&#xff09;是第一個也是至關重要的階段。它負責對源代碼進行初步的文本替換與組織&#xff0c;使得編譯器在后續階段能正確地處理規范化的代碼。預處理過程不僅影響編譯效率&…

快捷鍵——VsCode

一鍵折疊所有的代碼塊 先按 ctrl K&#xff0c;再ctrl 0 快速注釋一行 ctrl /

import 和require的區別

概念 import 是es6 規范&#xff0c;主要應用于瀏覽器和主流前端框架當中&#xff0c;export 導出&#xff0c; require 是 commonjs 規范&#xff0c;主要應用于nodejs環境中&#xff0c;module.exports 導出編譯規則 import 靜態導入是編譯時解析&#xff0c;動態導入是執…

8、鴻蒙Harmony Next開發:相對布局 (RelativeContainer)

目錄 概述 基本概念 設置依賴關系 設置參考邊界 設置錨點 設置相對于錨點的對齊位置 子組件位置偏移 多種組件的對齊布局 組件尺寸 多個組件形成鏈 概述 RelativeContainer是一種采用相對布局的容器&#xff0c;支持容器內部的子元素設置相對位置關系&#xff0c;適…

Linux命令的命令歷史

Linux下history命令可以對當前系統中執行過的所有shell命令進行顯示。重復執行命令歷史中的某個命令&#xff0c;使用&#xff1a;!命令編號&#xff1b;環境變量histsize的值保存歷史命令記錄的總行數&#xff1b;可用echo查看一下&#xff1b;需要大寫&#xff1b;環境變量hi…

【C++小白逆襲】內存管理從崩潰到精通的秘籍

目錄【C小白逆襲】內存管理從崩潰到精通的秘籍前言&#xff1a;為什么內存管理讓我掉了N根頭發&#xff1f;內存四區大揭秘&#xff1a;你的變量都住在哪里&#xff1f;&#x1f3e0;內存就像大學宿舍區 &#x1f3d8;?C語言的內存管理&#xff1a;手動搬磚時代 &#x1f9f1;…

【網絡安全】利用 Cookie Sandwich 竊取 HttpOnly Cookie

未經許可,不得轉載。 文章目錄 引言Cookie 三明治原理解析Apache Tomcat 行為Python 框架行為竊取 HttpOnly 的 PHPSESSID Cookie第一步:識別 XSS 漏洞第二步:發現反射型 Cookie 參數第三步:通過 Cookie 降級實現信息泄露第四步:整合攻擊流程修復建議引言 本文將介紹一種…

【工具】什么軟件識別重復數字?

網上的數字統計工具雖多&#xff0c;但處理重復數字時總有點不盡如人意。 要么只能按指定格式輸入&#xff0c;要么重時得手動一點點篩&#xff0c;遇上數據量多的情況&#xff0c;光是找出重復的數字就得另外花不少功夫。? 于是我做了個重復數字統計器&#xff0c;不管是零…

CSS分層渲染與微前端2.0:解鎖前端性能優化的新維度

CSS分層渲染與微前端2.0&#xff1a;解鎖前端性能優化的新維度 當你的頁面加載時間超過3秒&#xff0c;用戶的跳出率可能飆升40%以上。這并非危言聳聽&#xff0c;而是殘酷的現實。在當前前端應用日益復雜、功能日益臃腫的“新常態”下&#xff0c;性能優化早已不是錦上添花的“…

AI Agent開發學習系列 - langchain之Chains的使用(5):Transformation

Transformation&#xff08;轉換鏈&#xff09;是 LangChain 中用于“自定義數據處理”的鏈式工具&#xff0c;允許你在鏈路中插入任意 Python 代碼&#xff0c;對輸入或中間結果進行靈活處理。常用于&#xff1a; 對輸入/輸出做格式化、過濾、摘要、拆分等自定義操作作為 LLMC…

Druid 連接池使用詳解

Druid 連接池使用詳解 一、Druid 核心優勢與架構 1. Druid 核心特性 特性說明價值監控統計內置 SQL 監控/防火墻實時查看 SQL 執行情況防 SQL 注入WallFilter 防御機制提升系統安全性加密支持數據庫密碼加密存儲符合安全審計要求擴展性強Filter 鏈式架構自定義功能擴展高性能…

9.2 埃爾米特矩陣和酉矩陣

一、復向量的長度 本節的主要內容可概括為&#xff1a;當對一個復向量 z\pmb zz 或復矩陣 A\pmb AA 轉置后&#xff0c;還要取復共軛。 不能在 zTz^TzT 或 ATA^TAT 時就停下來&#xff0c;還要對所有的虛部取相反的符號。對于一個分量為 zjajibjz_ja_jib_jzj?aj?ibj? 的列向…

AI驅動的低代碼革命:解構與重塑開發范式

引言&#xff1a;低代碼平臺的范式轉移 當AI技術與低代碼平臺深度融合&#xff0c;軟件開發正經歷從"可視化編程"到"意圖驅動開發"的根本性轉變。這種變革不僅提升了開發效率&#xff0c;更重新定義了人與系統的交互方式。本文將從AI介入的解構層次、交互范…

zookeeper etcd區別

ZooKeeper與etcd的核心區別體現在設計理念、數據模型、一致性協議及適用場景等方面。?ZooKeeper基于ZAB協議實現分布式協調&#xff0c;采用樹形數據結構和臨時節點特性&#xff0c;適合傳統分布式系統&#xff1b;而etcd基于Raft協議&#xff0c;以高性能鍵值對存儲為核心&am…

模擬注意力:少量參數放大 Attention 表征能力

論文標題 SAS: Simulated Attention Score 論文地址 https://arxiv.org/pdf/2507.07694 代碼 見論文附錄 作者背景 摩根士丹利&#xff0c;斯坦福大學&#xff0c;微軟研究院&#xff0c;新加坡國立大學&#xff0c;得克薩斯大學奧斯汀分校&#xff0c;香港大學 動機 …

零基礎|寶塔面板|frp內網穿透|esp32cam遠程訪問|微信小程序

1.準備好阿里云服務器和寶塔面板2.安裝frp服務端3.測試(密碼賬號在詳情里面)4.配置客戶端#一、沒有域名情況下 [common] server_addr #公網ip地址&#xff0c;vps server_port 7000 服務的bind_port token 12121212 [httpname] type tcp # 沒有域名情況下使用 tcp local_i…

Spring Boot整合MyBatis+MySQL+Redis單表CRUD教程

Spring Boot整合MyBatisMySQLRedis單表CRUD教程 環境準備 1. Redis安裝&#xff08;Windows&#xff09; # 下載Redis for Windows # 訪問: https://github.com/tporadowski/redis/releases # 下載Redis-x64-5.0.14.1.msi并安裝# 啟動Redis服務 redis-server# 測試連接 redis-c…