java的線程池介紹

什么是線程池?

線程池是一種用于管理和復用線程的機制,旨在減少線程的創建和銷毀次數,提高線程的可重用性和執行效率。通過線程池,可以控制線程的數量、數量大小以及線程的執行方式,從而更加有效地處理并發任務。

線程池的好處?

  1. 降低系統開銷:減少了線程的創建和銷毀次數,減少了系統資源的開銷。
  2. 提高響應速度:線程池中的線程預先創建好,可以立即執行任務,提高了系統的響應速度。
  3. 精細的調優:可以通過配置線程池的參數,如核心線程數、最大線程數、任務隊列等,來靈活地控制線程執行的規模和調度方式。

常用的線程池?

1、FixedThreadPool(固定大小線程池)

  • 固定大小的線程池,線程數量一旦達到設定的核心線程數,就保持不變。
  • 如果有任務提交時,如果空閑線程可以處理,則立即處理;如果沒有空閑線程,則任務進入隊列等待。
  • 適用于需要限制線程數量的場景,比如數據庫連接池等。

2、CachedThreadPool(緩存線程池)

  • 線程數量根據需要自動調整,沒有核心線程,最大線程數為 Integer.MAX_VALUE。
  • 如果有空閑線程可用,則復用空閑線程;沒有則動態創建新線程。
  • 適用于執行大量短期異步任務的場景。

3、SingleThreadPool(單線程池)

  • 只有一個線程在工作,保證所有任務按照指定順序執行。
  • 如果這個線程異常結束,會創建一個新的線程代替它,保證順序執行。
  • 適用于需要順序執行任務的場景。

4、ScheduledThreadPool(定時任務線程池)

  • 用于執行定時任務和周期性任務。
  • 可以指定核心線程數量,可以根據需要動態調整線程數量。

線程池的七個參數?

1、核心線程數(corePoolSize)

  • 核心線程數指的是線程池中保持存活的線程數量,即使線程處于空閑狀態也會保持存活,除非設置了允許核心線程超時。

2、最大線程數(maximumPoolSize)

  • 最大線程數表示線程池中最大允許存在的線程數量,當任務達到一定數量時,線程池會創建新的線程來處理任務,直到達到最大線程數為止。

3、線程空閑時間(keepAliveTime)

  • 線程空閑時間表示當線程處于空閑狀態時,等待新任務的最長時間,超過這個時間會被回收銷毀,只保留核心線程數的線程。也稱為線程的存活時間。

4、時間單位(unit)

  • 時間單位用來指定 keepAliveTime 的單位,可以是秒、毫秒等。

5、工作隊列(workQueue)

  • 工作隊列用來存儲線程池等待執行的任務,有不同的實現方式,如 LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue 等。

6、線程工廠(threadFactory)

  • 線程工廠用來創建新線程,可以自定義線程工廠來為線程池創建定制化的線程。

7、拒絕策略(handler)

拒絕策略用來指定當任務無法被線程池執行時的處理方式,有多種預定義的策略可供選擇,默認是 AbortPolicy。一共有四種拒絕策略:

  • AbortPolicy(中止策略)

????????默認的拒絕策略。當線程池無法接受新任務時,會拋出 RejectedExecutionException 異常通知調用者任務無法繼續提交。

  • CallerRunsPolicy(調用者運行策略)

????????如果線程池無法接受新任務,則由主線程(提交任務的線程)自己執行這個任務。這種策略不會拋棄任務,而是直接在主線程中執行。

  • DiscardPolicy(丟棄策略)

????????當線程池無法接受新任務時,不做任何處理,直接丟棄無法執行的任務。

  • DiscardOldestPolicy(丟棄最老的任務策略)

????????當線程池無法接受新任務時,丟棄最早加入工作隊列但尚未被執行的任務,然后嘗試將新任務添加到隊列中。

如何創建線程池?

1、手動創建 ThreadPoolExecutor 對象

  • 可以通過直接創建 ThreadPoolExecutor 對象來自定義線程池的各種參數,如核心線程數、最大線程數、工作隊列類型等。
  • 通過構造函數 new ThreadPoolExecutor() 可以自定義線程池的各項參數,實現靈活的線程池管理。

2、Executors 工廠方法

  • Executors 類提供了一系列靜態工廠方法快速創建常見類型的線程池,如 newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor 等。
  • 這些工廠方法可以方便地創建不同類型的線程池,簡化了線程池的創建過程,但有時可能會因為一些默認參數而不適用于特定場景。

3、ScheduledExecutorService 創建定時任務線程池

  • ScheduledExecutorService 是一個支持定時任務和周期性任務執行的線程池。通過 Executors.newScheduledThreadPool() 方法創建。
  • 可以執行定時任務和周期性任務,具有方便的定時執行功能。

4、ForkJoinPool 創建并行任務線程池

  • ForkJoinPool 是 Java 7 中引入的用于支持并行任務執行的線程池,適用于拆分任務并行執行的場景。
  • 通過 new ForkJoinPool() 構造方法創建,并通過 ForkJoinTask 提交任務。

線程池的執行流程?

為什么阿里的Java開發規范中禁止使用Executors創建線程池?

1、FixedThreadPool和SingleThreadPool

????????這兩種線程池都使用無界的 LinkedBlockingQueue 作為任務隊列,當請求隊列長度無限制時(Integer.MAX_VALUE),如果請求產生過快,可能會導致請求堆積,消耗大量內存資源,最終導致內存溢出。

2、CachedThreadPool和ScheduledThreadPool

????????這兩種線程池使用的是 SynchronousQueue,且線程數量上限為 Integer.MAX_VALUE。如果系統中的任務量過大,可能會導致大量線程被創建,這會消耗大量系統資源,包括內存和 CPU 資源,最終也可能導致內存溢出。

3、線程池的拒絕策略可能不當

Executors創建的線程池默認的拒絕策略是拋出RejectedExecutionException異常,這可能會導致任務提交者無法得到合理的反饋,而采用更合理的拒絕策略需要自定義ThreadPoolExecutor。

ps:以下是我整理的java面試資料,密碼是obht,感興趣的可以看看。最后,創作不易,覺得寫得不錯的可以點點關注!

鏈接:https://www.yuque.com/u39298356/uu4hxh?# 《Java面試寶典》?

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

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

相關文章

代碼隨想錄刷題第48天

今天來看看股票市場。第一題是買賣股票的最佳時機https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/,首先想到了暴力解法,兩層for循環,時間復雜度為n * n,代碼超時了。 class Solution { public:int m…

如何使用公網地址遠程訪問內網Nacos UI界面查看注冊服務

文章目錄 1. Docker 運行Nacos2. 本地訪問Nacos3. Linux安裝Cpolar4. 配置Nacos UI界面公網地址5. 遠程訪問 Nacos UI界面6. 固定Nacos UI界面公網地址7. 固定地址訪問Plik Nacos是阿里開放的一款中間件,也是一款服務注冊中心,它主要提供三種功能:持久化…

關于gossip協議

Gossip協議,也稱為流言協議,是一種在分布式系統中用于節點之間通信和數據同步的算法。它的設計靈感來自于人類社交中的流言傳播機制:一個人告訴幾個人某個消息,這幾個人再各自告訴其他幾個人,如此反復,最終…

6、wuzhicms代碼審計

wuzhicms代碼審計 前言 安裝環境配置 服務器要求 Web服務器: apache/nginx/iis PHP環境要求:支持php5.2、php5.3、php5.4、php5.5、php5.6、php7.1 (推薦使用5.4或更高版本!) 數據庫要求: Mysql5www/install文件夾即可進入安裝頁面 審計開始 首頁文件index.php&#xff0c…

使用Files工具類中的walkFileTree(Path, FileVisitor)方法對文件進行操作

使用Files工具類中的walkFileTree(Path, FileVisitor)方法,其中需要傳入兩個參數 Path:文件起始路徑FileVisitor:文件訪問器,使用訪問者模式 接口的實現類SimpleFileVisitor有四個方法 preVisitDirectory:訪問目錄前的…

PHP curl 獲取當前請求 header 信息

一、正常 curl 獲取響應結果 1)、curl請求代碼 $url http:://www.baidu.com; $data [param > test]; $ch curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array("content-type:application/json&qu…

kubernetes+prometheus+grafana監控+alertmanager實現qq郵箱報警

prometheus基于kubernetes監控 prometheus對kubernetes的監控 對于Kubernetes而言,我們可以把當中所有的資源分為幾類: 基礎設施層(Node):集群節點,為整個集群和應用提供運行時資源容器基礎設施&#xff…

C/C++內存管理及內存泄漏詳解

目錄 C/C內存分布 C語言中動態內存管理方式:malloc/calloc/realloc/free C內存管理方式 new/delete操作內置類型 new和delete操作自定義類型 operator new與operator delete函數 new和delete的實現原理 內置類型 自定義類型 內存泄漏 概念 內存泄漏分類 ?…

180基于matlab的頻率切片小波變換程序(FTWT)

基于matlab的頻率切片小波變換程序(FTWT)。從一種新的角度出發,通過自由選擇頻率切片函數、引進新尺度參數,在頻率域實現小波變換,該變換能夠很好地刻畫信號各成分之間的相對能量關系。此外,頻率切片小波變…

【InternLM 實戰營筆記】OpenCompass大模型評測

隨著人工智能技術的快速發展, 大規模預訓練自然語言模型成為了研究熱點和關注焦點。OpenAI于2018年提出了第一代GPT模型,開辟了自然語言模型生成式預訓練的路線。沿著這條路線,隨后又陸續發布了GPT-2和GPT-3模型。與此同時,谷歌也…

探討蘋果 Vision Pro 的 AI 數字人形象問題

Personas 的設計模糊性: 部分人認為這種模糊設計可能是出于安全考慮🛡?。安全角度:Personas 代表著你的 AI 數字形象,在創建時,它相當于你的 AVP(生物識別掃描器的存在增加了冒充的難度)。如果…

40、網絡編程/TCP和UDP通信模型練習20240229

一、使用TCP模型創建服務器和客戶端完成簡單通信。 服務器代碼&#xff1a; #include<myhead.h> #define SER_IP "192.168.32.130" #define SER_PORT 8888 int main(int argc, const char *argv[]) {//1.創建監聽的套接字int sfd-1;sfdsocket(AF_INET,SOCK_S…

解決 MySQL 未運行但鎖文件存在的問題

查看mysql狀態時&#xff0c;顯示錯誤信息"ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists"。 解決步驟 1、檢查 MySQL 進程是否正在運行 在繼續之前&#xff0c;我們首先需要確定 MySQL 進程是否正在運行。我們可以使用以下命令檢查…

MBD開發專欄介紹

文章目錄 MBD概念MBD工具箱介紹MBD專欄介紹MBD概念 MBD : Model-Based Design,基于模型的設計方法是一種系統開發方法論,即對系統進行建模、分析、驗證,然后基于模型自動生成代碼、測試用例和文檔的設計開發過程MBD采用的是基于自然語言和圖形語言的雙重建模方式,讓模型與用…

港中文聯合MIT提出超長上下文LongLoRA大模型微調算法

論文名稱&#xff1a; LongLoRA: Efficient Fine-tuning of Long-Context Large Language Models 文章鏈接&#xff1a;https://arxiv.org/abs/2309.12307 代碼倉庫&#xff1a; https://github.com/dvlab-research/LongLoRA 現階段&#xff0c;上下文窗口長度基本上成為了評估…

算法修煉-動態規劃之路徑問題(1)

62. 不同路徑 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;選定一個網格為終點&#xff0c;走到這個網格的所有走法就是這個網格的上面一個網格的所有走法加上這個網格左邊一個網格的所有走法&#xff0c;然后做好初始化工作就行。 class Solution { public:int…

MATLAB環境下基于偏置場校正的改進模糊c-均值聚類圖像分割算法

基于聚類的分割方法是以統計學為基礎提出的一種分割方法。其實質是通過計算像素與每一類聚類中心的歐氏距離來判定像素與每一類聚類中心的相似性&#xff0c;距離近就說明像素與聚類中心相似性大&#xff0c;反之相似性小。基于一定標準下的相似性自動劃分成若干個子集(類)&…

markdown筆記(自用)

一.標題語法#空格&#xff0c;幾個#就是幾級標題 四級標題<H> 二.段落語法 用空白行分開 你好 三.換行 在一行的末尾添加兩個或多個空格&#xff0c;然后 v vvvvv 按回車鍵,即可創建一個換行()。 換行與段落的區別在于換行后兩行是挨著的&#xff0c;而段落之間有一…

項目預備知識

導入兩個頭文件 #include <graphics.h> // 引入 EasyX 的圖形庫頭文件 #include <conio.h> // 引入 conio.h 以使用 getch() 窗口創建函數&#xff1a;小黑屏 initgraph(640, 480, SHOWCONSOLE); closegraph(); //關閉一個窗口 設置背景顏色&#xff1a;這…

10.7、華為數通HCIP-DataCom H12-821單選題:121-140

121、關于OSPF特性描述錯誤的是:D A、OSPF采用鏈路狀態算法。 B、每個路由器通過泛洪 LSA 向外發布本地鏈路狀態信息 C、每臺 OSPF 設備都會收集其它路由器發來的LSA 所有的LSA 放在一起便組成了鏈路狀態數據庫LSDB, D、OSPF 區域0中所有路由器的 LSDB 都相同。 E、每臺…