程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java concurrency線程池之線程池原理(一)_動力節點Java學院整理

Java concurrency線程池之線程池原理(一)_動力節點Java學院整理

編輯:關於JAVA

ThreadPoolExecutor簡介

ThreadPoolExecutor是線程池類。對於線程池,可以通俗的將它理解為"存放一定數量線程的一個線程集合。線程池允許若個線程同時允許,允許同時運行的線程數量就是線程池的容量;當添加的到線程池中的線程超過它的容量時,會有一部分線程阻塞等待。線程池會通過相應的調度策略和拒絕策略,對添加到線程池中的線程進行管理。" 

ThreadPoolExecutor數據結構

ThreadPoolExecutor的數據結構如下圖所示:

各個數據在ThreadPoolExecutor.java中的定義如下:

// 阻塞隊列。
private final BlockingQueue<Runnable> workQueue;
// 互斥鎖
private final ReentrantLock mainLock = new ReentrantLock();
// 線程集合。一個Worker對應一個線程。
private final HashSet<Worker> workers = new HashSet<Worker>();
// “終止條件”,與“mainLock”綁定。
private final Condition termination = mainLock.newCondition();
// 線程池中線程數量曾經達到過的最大值。
private int largestPoolSize;
// 已完成任務數量
private long completedTaskCount;
// ThreadFactory對象,用於創建線程。
private volatile ThreadFactory threadFactory;
// 拒絕策略的處理句柄。
private volatile RejectedExecutionHandler handler;
// 保持線程存活時間。
private volatile long keepAliveTime;

private volatile boolean allowCoreThreadTimeOut;
// 核心池大小
private volatile int corePoolSize;
// 最大池大小
private volatile int maximumPoolSize;

 

1. workers

    workers是HashSet<Work>類型,即它是一個Worker集合。而一個Worker對應一個線程,也就是說線程池通過workers包含了"一個線程集合"。當Worker對應的線程池啟動時,它會執行線程池中的任務;當執行完一個任務後,它會從線程池的阻塞隊列中取出一個阻塞的任務來繼續運行。
    wokers的作用是,線程池通過它實現了"允許多個線程同時運行"。

2. workQueue

    workQueue是BlockingQueue類型,即它是一個阻塞隊列。當線程池中的線程數超過它的容量的時候,線程會進入阻塞隊列進行阻塞等待。
    通過workQueue,線程池實現了阻塞功能。

3. mainLock

    mainLock是互斥鎖,通過mainLock實現了對線程池的互斥訪問。

4. corePoolSize和maximumPoolSize

    corePoolSize是"核心池大小",maximumPoolSize是"最大池大小"。它們的作用是調整"線程池中實際運行的線程的數量"。
    例如,當新任務提交給線程池時(通過execute方法)。
          -- 如果此時,線程池中運行的線程數量< corePoolSize,則創建新線程來處理請求。
          -- 如果此時,線程池中運行的線程數量> corePoolSize,但是卻< maximumPoolSize;則僅當阻塞隊列滿時才創建新線程。
          如果設置的 corePoolSize 和 maximumPoolSize 相同,則創建了固定大小的線程池。如果將 maximumPoolSize 設置為基本的無界值(如 Integer.MAX_VALUE),則允許池適應任意數量的並發任務。在大多數情況下,核心池大小和最大池大小的值是在創建線程池設置的;但是,也可以使用 setCorePoolSize(int) 和 setMaximumPoolSize(int) 進行動態更改。

5. poolSize

    poolSize是當前線程池的實際大小,即線程池中任務的數量。

6. allowCoreThreadTimeOut和keepAliveTime

    allowCoreThreadTimeOut表示是否允許"線程在空閒狀態時,仍然能夠存活";而keepAliveTime是當線程池處於空閒狀態的時候,超過keepAliveTime時間之後,空閒的線程會被終止。

7. threadFactory

    threadFactory是ThreadFactory對象。它是一個線程工廠類,"線程池通過ThreadFactory創建線程"。

8. handler

    handler是RejectedExecutionHandler類型。它是"線程池拒絕策略"的句柄,也就是說"當某任務添加到線程池中,而線程池拒絕該任務時,線程池會通過handler進行相應的處理"。

綜上所說,線程池通過workers來管理"線程集合",每個線程在啟動後,會執行線程池中的任務;當一個任務執行完後,它會從線程池的阻塞隊列中取出任務來繼續運行。阻塞隊列是管理線程池任務的隊列,當添加到線程池中的任務超過線程池的容量時,該任務就會進入阻塞隊列進行等待。 

線程池調度

我們通過下面的圖看看下面線程池中任務的調度策略,加深對線程池的理解。

圖-01:

圖-02:

說明:

    在"圖-01"中,線程池中有N個任務。"任務1", "任務2", "任務3"這3個任務在執行,而"任務3"到"任務N"在阻塞隊列中等待。正在執行的任務,在workers集合中,workers集合包含3個Worker,每一個Worker對應一個Thread線程,Thread線程每次處理一個任務。
    當workers集合中處理完某一個任務之後,會從阻塞隊列中取出一個任務來繼續執行,如圖-02所示。圖-02表示"任務1"處理完畢之後,線程池將"任務4"從阻塞隊列中取出,放到workers中進行處理。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved