首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2SE

J2SE 5.0 執行緒池深度解析(二):核心參數 Sizes 與 Queues 運作機制

     編輯:J2SE

核心概念:Sizes 與 Queues

Size:執行緒池大小在最小值 corePoolSize 與最大值 maximumPoolSize 之間動態調整,可透過 getPoolSize() 取得當前大小。

Queue:用於存放等待執行的任務。

執行緒池運作流程逐步分析

ThreadPoolExecutor tpe = new ThreadPoolExecutor(
    M, N, TIMEOUT, TimeUnit.MILLISECONDS,
    new LinkedBlockingQueue<Runnable>()
);

Task[] tasks = new Task[nTasks];
for (int i = 0; i < nTasks; i++) {
    tasks[i] = new Task(n, "Task " + i);
    tpe.execute(tasks[i]);
}
tpe.shutdown();
  1. 建構執行緒池(M 核心執行緒、N 最大執行緒),此時尚未建立任何執行緒(可透過 prestartAllCoreThreads() 或 prestartCoreThread() 預先建立)。
  2. 提交任務時,會發生以下五種情況之一:
    • 執行緒數 < M:立即啟動新執行緒執行任務,即使有閒置執行緒,仍會建立新執行緒直到達到 M。
    • 執行緒數在 M~N 之間且有閒置執行緒:由閒置執行緒執行。
    • 執行緒數在 M~N 之間但無閒置執行緒,且隊列未滿:任務放入隊列,不建立新執行緒。
    • 執行緒數在 M~N 之間但無閒置執行緒,且隊列已滿:啟動新執行緒執行任務。
    • 執行緒數已達 N 且無閒置執行緒:嘗試將任務放入隊列;若隊列已達最大容量,任務被拒絕;否則任務等待閒置執行緒。
  3. 任務執行完成後,執行緒取出隊列下一個任務;若隊列為空:
    • 執行緒數 > M:執行緒等待新任務,超時(建構時指定的 TIMEOUT)則退出以減少執行緒數;若 TIMEOUT=0,執行緒執行完即退出,忽略 corePoolSize。
    • 執行緒數 ≤ M:執行緒無限期阻塞等待新任務(除非 TIMEOUT=0,則退出)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved