天天看點

Java并發程式設計-ThreadPoolExecutor 線程池

目錄

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. 線程池實作/工作原理

送出新任務到線程池時,線程池的處理流程如下圖所示:

Java并發程式設計-ThreadPoolExecutor 線程池

圖上圖所示,判斷節點的順序分别是 coreSize -- > queue --> maxSize --> rejectStrategy

例如當調用了ThreadPoolExecutor執行execute()方式時,流程示意圖如下,對應剛剛上圖的一個處理流程,其中步驟1、3建立新的線程時需要擷取全局鎖(會影響性能):

Java并發程式設計-ThreadPoolExecutor 線程池

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