目錄
1. 概述
2. 使用線程池可帶來哪些優點
3. 線程池實作/工作原理
4. 建立線程池的幾種不同方式
4.1 newSingleThreadExecutor()
4.2 newCachedThreadPool()
4.3 newFixedThreadPool(int nThreads)
4.4 newSingleThreadScheduledExecutor() 和 newScheduleThreadPool(int corePoolSize)
4.5 newWorkStrealingPool(int parallelism)
4.6 ThreadPoolExecutor
5. ThreadPollExecutor 構造方法介紹
6. 參考資料
1. 概述
線程池是運用場景最多的并發架構,異步或并發執行的任務都可以使用。
提示:本文根據一些資料學習總結而成,文末有參考連結
2. 使用線程池可帶來哪些優點
- 降低資源消耗: 重複利用已建立的線程,降低線程建立和消費造成的消耗。
- 提高任務響應速度: 送出任務時,可直接運作,不必等待建立一個新的線程。
- 提高線程的可管理性: 線程池可對線程進行統一配置設定、調優和監控,防止無限制建立消耗系統資源、降低系統穩定性。
3. 線程池實作/工作原理
送出新任務到線程池時,線程池的處理流程如下圖所示:
圖上圖所示,判斷節點的順序分别是 coreSize -- > queue --> maxSize --> rejectStrategy
例如當調用了ThreadPoolExecutor執行execute()方式時,流程示意圖如下,對應剛剛上圖的一個處理流程,其中步驟1、3建立新的線程時需要擷取全局鎖(會影響性能):
4. 建立線程池的幾種不同方式
線程池有以下幾個建立方式
4.1 newSingleThreadExecutor()
該靜态工廠方法的其特點是:
- 線程數目為 1
- 工作隊列是無界的:是以如果一直送出任務,容易将記憶體沾滿,使系統崩潰,(預設是什麼隊列??)
- 任務順序執行:
4.2 newCachedThreadPool()
特點如下:
- 适用于處理大量短時間工作任務
- 通過緩存線程來重用,線程長時間閑置時,不會消耗什麼資源
- 使用synchronousQueue作為工作隊列
4.3 newFixedThreadPool(int nThreads)
其特點是:
- 重用指定數目nThreads的線程,線程池中任何時候都有nThreads個線程;當有線程退出,則會建立新線程,以補充到指定資料nThreads。
- 使用無界工作隊列:是以如果一直送出任務,容易将記憶體沾滿,使系統崩潰,(預設是什麼隊列??)
4.4 newSingleThreadScheduledExecutor() 和 newScheduleThreadPool(int corePoolSize)
内部會建立ScheduledExecutorService,可進行定時的工作排程,前者是一個線程,後者是多個線程
4.5 newWorkStrealingPool(int parallelism)
java 8引進的方法,内部構件ForkJoinPool利用work-strealing算法并行處理任務,不保證執行順序。
4.6 ThreadPoolExecutor
最進基本的線程池建立方法,前面的1-3都是對ThreadPoolExecutor的封裝。
5. ThreadPollExecutor 構造方法介紹
使用該構造方法建立線程池,構造方法有7個參數
參考這裡
6. 參考資料
(1)https://www.cnblogs.com/i-code/p/13917733.html
(2)https://mp.weixin.qq.com/s?__biz=MzAxMjYyMTYxMQ==&mid=2453156229&idx=1&sn=592d1a57854439d504e62aa41a1733a1&chksm=8c6393c1bb141ad70b12aaaa7ad40ac6b263cc54fed0a771567c785bc4f88f5edb36cb36497d&scene=178&cur_album_id=1528417970434162690#rd