當前位置:
首頁 > 知識 > Java線程池入門必備

Java線程池入門必備


線程池

一. 線程池的簡介

1.什麼是線程池?

最早期的工作線程處理任務的模型。一個任務的到來,會伴隨著線程的創建,當處理完任務後,線程會被銷毀,資源回收。這種一個任務一個線程一系列創建銷毀的模式,缺陷毋庸置疑.不僅是線程創建銷毀帶來的系統開銷,也不好管理工作線程。於是引入了「線程池」的概念。它是一種預創建線程的技術。每次線程執行完任務前,先把任務委派給線程池空閑的線程, 如果沒有空閑的線程, 則根據線程池任務策略執行。處理完任務後, 線程不會直接被銷毀掉,會放到線程池管理。

2.線程池有何作用?

線程池的作用, 個人理解主要有三點。

  • 減少系統資源的開銷 :避免新線程的創建、銷毀等繁瑣過程。

  • 提供系統的性能 : 池至少有一個以上的線程, 多線程協同工作, 可響應多個客戶端請求。而且可以重複利用池裡空閑的線程,免去了新線程不斷地創建、銷毀過程.

  • 提高系統穩定性 :一個請求一個線程處理, 高並發請求下, 系統不得不創建大量線程來接活。大量的線程創建、銷毀會佔用系統大量資源, 最終耗光系統資源, 導致系統宕機。引入線程池後,能根據系統的承載能力, 調整線程池中工作線線程的數目,防止因為消耗過多的內存,而把伺服器累趴下(每個線程需要大約1MB內存,線程開的越多,消耗的內存也就越大,最後死機)。

二. 線程池的創建

線程池的創建入口Executors.真正幹活的是ExecutorService

1.newFixedThreadPool

  • 說明

創建固定大小的線程池。每次提交一個任務,就會啟一個線程來接客,直到線程池的線程數量達到線程池的上限。

  • demo

Java線程池入門必備

2. newCachedThreadPool

  • 說明

創建一個可緩存的線程池。每次提交一個任務,委派給線程池空閑的線程處理, 如果木有空閑的線程, 則直接創建新線程,任務被執行完後,當前線程加入到線程池維護。其生命周期超過一定時間會被銷毀回收。

  • demo

Java線程池入門必備

3. newSingleThreadExecutor

  • 說明

創建只有一個線程的線程池。問題來了, 一個線程的線程池和普通創建一個線程一樣么?當然不一樣.線程銷毀問題。

  • demo

Java線程池入門必備

4. newScheduledThreadPool

  • 說明

創建一個大小不受限的線程池。提供定時、周期地執行任務能力。

  • demo

Java線程池入門必備

  • 定時周期執行demo2

Java線程池入門必備

拓展scheduleWithFixedDelay | scheduleAtFixedRate 區別

看下源碼注釋

  • scheduleAtFixedRate

Java線程池入門必備

  • scheduleWithFixedDelay

Java線程池入門必備

不難得出如下結論:

ScheduledExecutorService 中兩種最常用的調度方法 ScheduleAtFixedRate 和

三. 線程池的拒絕策略

線程池的拒絕策略是幹嘛來的?它是在應接不暇的時候, 對新任務採取的執行策略(執行?丟棄and so on). RejectedExecutionHandler是拒絕任務策略的基礎介面, Jdk提供了四種拒絕策略。

1.CallerRunsPolicy

這種策略是說線程池在沒被關閉前, 直接會去執行此任務, 否則丟棄任務。

Java線程池入門必備

2.AbortPolicy

AbortPolicy線程拒絕策略,簡單粗暴, 直接throw exception出來了, 丟棄任務

Java線程池入門必備

3.DiscardPolicy

DiscardPolicy策略跟AbortPolicy一樣, 直接丟棄任務, 只不過人家不拋出exception罷了。

Java線程池入門必備

4.DiscardOldestPolicy

DiscardOldestPolicy策略, 是在線程池沒被關閉的情況下, 丟棄任務等待隊列中最早的任務。然後重新嘗試運行該任務。

Java線程池入門必備


學習Java的同學注意了!!!

學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入Java學習交流群495273252,我們一起學Java!

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Java團長 的精彩文章:

Java進階自測——面向對象基礎知識掌握了嗎?
自學的程序員如何找到好工作?
Java基礎——簡單實現線程池
Java集合——LinkedList
快速認識Java內存區域劃分

TAG:Java團長 |

您可能感興趣

Python 並發編程之線程池/進程池
詳解 Tomcat 的連接數與線程池
Python的Socket知識6:線程、線程鎖、線程池、上下文管理
FutureTask 在線程池中應用和源碼解析
線程池ThreadPoolExecutor里Control state,ctl參數的分析(一)
線程池ThreadPoolExecutor里Control state,ctl參數的分析(二)
你懂ThreadPoolExecutor線程池技術嗎?看源碼你會有全新的認識
線程池定製初探
如何設計一個實用的線程池?