線程池理解及7個參數

定義理解

線程池其實是一種池化的技術實現,池化技術的核心思想就是實現資源的復用,避免資源的重復創建和銷毀帶來的性能開銷。線程池可以管理一堆線程,讓線程執行完任務之后不進行銷毀,而是繼續去處理其它線程已經提交的任務。

使用線程池的好處

  • 降低資源消耗。通過重復利用已創建的線程降低線程創建和銷毀造成的消耗。
  • 提高響應速度。當任務到達時,任務可以不需要等到線程創建就能立即執行。
  • 提高線程的可管理性。線程是稀缺資源,如果無限制的創建,不僅會消耗系統資源,還會降低系統的穩定性,使用線程池可以進行統一的分配,調優和監控。

構造參數

在這里插入圖片描述

  • corePoolSize:線程池中用來工作的核心線程數量
  • maximumPoolSize:最大線程數,線程池允許創建的最大線程數。當線程池中的線程數達到corePoolSize后,如果任務隊列已滿,且需要繼續處理新任務,線程池會創建新線程(但總數不超過maximumPoolSize)來處理這些任務。(相當于排隊區滿了后,后來的線程可以直接插隊)如果任務數超過了maximumPoolSize,且任務隊列已滿,則線程池會根據拒絕策略來處理這些無法執行的任務。
  • keepAliveTime:超出 corePoolSize 后創建的線程存活時間或者是所有線程最大存活時間,取決于配置。
  • unit:keepAliveTime 的時間單位
  • workQueue:任務隊列,是一個阻塞隊列,當線程數達到核心線程數后,會將任務存儲在阻塞隊列中。常見實現:BlockingQueue接口的實現類,如ArrayBlockingQueue、LinkedBlockingQueue等。
  • threadFactory :線程池內部創建線程所用的工廠
  • handler:拒絕策略;當隊列已滿并且線程數量達到最大線程數量時,會調用該方法處理任務。

如何設置參數

1. 確定核心線程數(corePoolSize)

  • CPU密集型任務:對于CPU密集型任務,通常將核心線程數設置為CPU核心數的1到2倍之間。這可以確保充分利用CPU資源,同時避免過多的上下文切換。
  • IO密集型任務:對于IO密集型任務,由于線程在等待IO操作時不會占用CPU,因此可以設置更多的核心線程數。一般來說,可以將核心線程數設置為CPU核心數的2倍以上,以便在等待IO時能夠處理更多的任務。
  • 混合型任務:如果應用程序同時包含CPU密集型和IO密集型任務,則需要根據具體情況來平衡核心線程數的設置。

2. 確定最大線程數(maximumPoolSize)

  • 資源受限的環境:在資源受限的環境中(如嵌入式系統或云服務器),需要限制最大線程數以防止過多線程占用資源。
  • 高并發系統:對于需要處理大量并發請求的系統,可以適當增加最大線程數以提高系統的并發處理能力。但是,最大線程數的設置應該基于系統的負載能力和資源狀況進行綜合考慮。

3. 設置線程空閑時間(keepAliveTime)

  • CPU密集型應用:對于CPU密集型應用,通常可以將線程空閑時間設置為較短的值,因為CPU資源非常寶貴,不希望有過多的空閑線程占用資源。在某些情況下,甚至可以將其設置為0,表示不保留非核心線程。
  • IO密集型應用:對于IO密集型應用,由于線程在等待IO操作時不會占用CPU資源,因此可以將線程空閑時間設置為較長的值(如1分鐘以上),以避免線程頻繁啟動和銷毀造成的性能開銷。

4. 選擇任務隊列(workQueue)

  • 有界隊列:使用有界隊列可以限制任務在隊列中的等待時間,避免因為任務過多而導致內存溢出。但是,如果隊列長度設置過小,可能會導致任務被拒絕。(一般選擇有界隊列
  • 無界隊列:使用無界隊列可以盡可能地緩存所有任務,但是需要注意內存消耗問題。如果使用了無界隊列,線程池的最大線程數參數可能會變得無效,因為線程池不會嘗試創建新線程來處理隊列中的任務。

5. 配置線程工廠(threadFactory)

線程工廠用于創建新線程。通過自定義線程工廠,可以設定線程的優先級、守護線程狀態等屬性,也可以為線程設置有意義的名字,便于在JVM中進行問題診斷。

6. 配置拒絕策略(handler)

當線程池無法處理新任務時(即線程數已達到maximumPoolSize,且任務隊列已滿),需要配置拒絕策略來處理這些無法執行的任務。常見的拒絕策略包括直接拋出異常用調用者所在的線程來執行任務忽略新任務以及拋棄隊列中最老的任務等。也可以根據需要自定義拒絕策略。

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

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

相關文章

GStreamer學習5----probe數據探測

參考資料: gstreamer中如何使用probe(探針)獲取幀數據_gstreamer 視頻編碼時獲取視頻關鍵幀信息-CSDN博客 Gstreamer中可以使用AppSink作為一個分支來查看管線中的數據,還可以使用probe去處理。 在GStreamer中,probe…

LayerNorm Plugin的使用與說明

目錄 前言0. 簡述1. Layernorm Plugin的使用1.1 源碼下載1.2 模型下載和修改1.3 環境配置1.4 編譯1.4 engine生成和執行(trtexec)1.5 enging生成和執行(C API) 2. 補充說明2.1 RTMO顯存占用問題2.2 插件找不到的說明2.3 LayerNorm plugin封裝的嘗試2.4 layerNorm plugin核函數實…

拉曼光譜入門:3.拉曼光譜的特征參數與定量定性分析策略

1.特征參數 1.1 退偏振率 退偏振率(p)是一個衡量拉曼散射光偏振狀態的參數,它描述了拉曼散射光的偏振方向與入射光偏振方向之間的關系。退偏振率定義為垂直偏振方向的拉曼散射強度與平行偏振方向的拉曼散射強度之比。退偏振率(p&…

禁用windows的語音識別快捷鍵win+ctrl+s

win11組合鍵winctrls會彈出語音識別提示,即使到設置里禁用了語音識別也沒用 解決辦法:安裝PowerToys,通過“鍵盤管理器”-“重新映射快捷鍵”禁用 PowerToys是微軟自己的工具,不用擔心安全問題,下載地址:h…

系統設計題-簡易數據庫系統

一、設計一個簡易數據庫系統,包含create,insert,select三個指令。 create(int tableId,int colNum,String key):創建表,其id為tableId,如果該表已存在,則不做任何處理。colNum為表中列的數量&a…

洛谷 P3008 [USACO11JAN] Roads and Planes G

題意 有一張 n n n 點 ( m 1 m 2 ) (m_1m_2) (m1?m2?) 邊的無向圖,其中 m 1 m_1 m1? 條為無向邊,另外 m 2 m_2 m2? 條為有向邊, 無向邊的邊權可以為負。求 s s s 到其他每個點的最短路。 思路 使用 SPFA 會 T 掉一兩個點&#x…

第10章:網絡與信息安全

目錄 第10章:網絡與信息安全 網絡概述 計算機網絡概念 計算機網絡的分類 網絡的拓撲結構 ISO/OSI網絡體系結構 網絡互聯硬件 物理層互聯設備 數據鏈路層互聯設備 網絡層互聯設備 應用層互聯設備 網絡的協議與標準 網絡標準 TCP/IP協議族 網絡接口層協…

GCC擴展功能、函數,預處理命令

文章目錄 前言一、GCC C語言擴展聲明函數屬性變量屬性內斂匯編與原子操作相關的內建函數內存模型感知原子操作的內置函數使用溢出檢查執行算術的內置函數 - xxx 二、GCC C語言擴展interface和 pragmasTemplate 二、預處理過程及其指令預處理過程1. 字符集轉換2. Initial proces…

實現基于Spring Cloud的事件驅動微服務

實現基于Spring Cloud的事件驅動微服務 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 事件驅動架構在現代微服務架構中越來越受歡迎,它通過事件的…

【JAVA多線程】線程池概論

目錄 1.概述 2.ThreadPoolExector 2.1.參數 2.2.新任務提交流程 2.3.拒絕策略 2.4.代碼示例 1.概述 線程池的核心: 線程池的實現原理是個標準的生產消費者模型,調用方不停向線程池中寫數據,線程池中的線程組不停從隊列中取任務。 實現…

最新版Python安裝教程

一、安裝Python 1.下載Python 訪問Python官網: https:/www.oython.orgl 點擊downloads按鈕,在下拉框中選擇系統類型(windows/Mac OS./Linux等) 選擇下載最新穩定版本的Python 以下內容以演示安裝Windows操作系統64位的python 左邊是穩定發布版本Stabl…

python網絡編程-TCP/IP

鏈路層 幀組成(按順序): 目標MAC:6B 源MAC:6B 類型:2B 數據:46B-1500B CRC:4B 其中,源MAC為主機網卡地址,類型為來源網絡層的數據類型,ipv…

Self-Instruct構造Prompt的例子

人工構造一批Prompt做種子。(Starting with a small seed set of human-written tasks)每次把一些種子后來生成的Prompt,放到Input里做few-shot examples,用LLM生成更多的Prompt;(Using the LLM to generat…

PyTorch學習之torch.transpose函數

PyTorch學習之torch.transpose函數 一、簡介 torch.transpose 函數我們用于交換張量的維度。 二、語法 torch.transpose 函數用于交換給定張量的兩個維度,其語法如下: torch.transpose(input, dim0, dim1)三、參數 input:待交換維度的張…

kotlin 基礎

文章目錄 1、安裝 Java 和 Kotlin 環境2、程序代碼基本結構3、變量的聲明與使用4、數據類型5、數字類型的運算1)布爾類型2)字符類型3)字符串類型 6、 選擇結構1)(if - else)2) 選擇結構(when&am…

useImperativeHandle淺談

useImperativeHandle 是 React Hooks 提供的一個高級功能,它允許你在函數式組件中自定義并暴露特定的實例值或方法給父組件。主要的作用是: 自定義對外暴露的實例值或方法: 通常情況下,函數式組件內部的實例值或方法對外是不可見的&#xff0…

如何有效管理你的Facebook時間線?

Facebook作為全球最大的社交平臺之一,每天都有大量的信息和內容在用戶的時間線上展示。有效管理你的Facebook時間線,不僅可以提升用戶體驗,還能夠幫助你更好地控制信息流和社交互動。本文將探討多種方法和技巧,幫助你有效管理個人…

分班結果老師怎么發給家長?

分班結果老師怎么發給家長? 隨著新學期的腳步漸近,老師們的工作也變得愈發繁忙。從準備教學計劃到整理課程材料,每一項任務都不容小覷。而其中,分班結果的告知工作,更是讓不少老師頭疼不已。傳統的分班通知方式&#…

7、Redis主從復制過程

Redis主從復制過程 ? 當一個Redis節點(Slave節點)接受到類似slaveof 127.0.0.1 6380的指令直到其可以從master持續復制數據,大致經歷如下過程: 1、保存master地址 ? 當slave接收到slaveof命令后,slave會立即將新的…

Python爬蟲與數據可視化:構建完整的數據采集與分析流程

Python爬蟲技術概述 Python爬蟲是一種自動化的數據采集工具,它可以模擬瀏覽器行為,訪問網頁并提取所需信息。Python爬蟲的實現通常涉及以下幾個步驟: 發送網頁請求:使用requests庫向目標網站發送HTTP請求。獲取網頁內容&#xf…