Java線程池總結
線程池的好處
- 降低資源消耗
- 提高響應速度
- 提高線程的可管理性
線程池相關的具體參數
- corePoolSize
- 線程池的核心線程數。在沒有設置 allowCoreThreadTimeOut 為 true 的情況下,核心線程會在線程池中一直存活,即使處于閑置狀態。
- maximumPoolSize
- 線程池所能容納的最大線程數。當活動線程到達這個數值后,后續任務將會根據RejectedExecutionHandler 來進行拒絕策略處理。
- keepAliveTime
- 非核心線程閑置的超時時長。超過該時長,非核心線程就會被回收。
- 若線程池通過allowCoreThreadTimeOut()方法設置allowCoreThreadTimeOut屬性為True,則該時長同樣會作用于核心線程,AsyncTask配置的線程池就是這樣設置的。
- unit
- workQueue
- 線程池中的任務隊列,通過線程池的execute()方法提交的Runnable對象會存儲在該隊列中。
- ThreadFactory
- 線程工廠,為線程池提供創建新線程的功能。通過自定義,做一些自定義線程名的操作。
- RejectedExecutionHandler
- 當任務無法執行時(超過線程最大容量maximum并且workQueue已經被排滿了)的處理策略。
- 四種拒絕類型
- ThreadPoolExecutor.AbortPolicy : 當線程池中的數量等于最大線程數時拋 java.util.concurrent.RejectedExecutionException 異常,涉及到該異常的任務也不會被執行,線程池默認的拒絕策略就是該策略。
- ThreadPoolExecutor.DiscardPolicy() : 當線程池中的數量等于最大線程數時,默默丟棄不能執行的新加任務,不報任何異常
- ThreadPoolExecutor.CallerRunsPolicy() : 當線程池中的數量等于最大線程數時,重試添加當前的任務;它會自動重復調用execute()方法。
- ThreadPoolExecutor.DiscardOldestPolicy() : 當線程池中的數量等于最大線程數時,拋棄線程池中工作隊列頭部的任務(即等待時間最久的任務),并執行新傳入的任務。
線程池執行任務的順序
- 當線程數小于核心線程數時,創建線程,并處理請求
- 當線程數大于等于核心線程數時,且任務隊列未滿時,將任務放入任務隊列,隨著線程池中核心線程們不斷執行任務,只要線程池中有空閑的核心線程,線程池就從任務隊列中取任務并處理
- 當線程數大于等于核心線程數時,且任務隊列已滿時
- 若線程數小于最大線程數,創建線程
- 若線程數等于最大線程數,拋出異常,拒絕任務
newCachedThreadPool
- 具有緩存性質的線程池,線程可重復利用
- 線程最大空閑時間60s
- 沒有最大線程數限制
- 適用于任務耗時短,數量大
- 等待隊列是沒有容量的
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CachedThreadPoolTest {
public static void main(String[] args) {
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int index = i;
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
Runnable task = new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName() + ">>" + index);
}
};
cachedThreadPool.execute(task);
}
}
}
newFixedThreadPool
- 具有固定數量的線程池
- 核心線程數等于最大線程數
- 線程最大空閑時間0
- 執行完即銷毀
- 超出最大線程數進行等待
- 高并發下控制性能
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class FixedThreadPoolTest {
public static void main(String[] args) {
System.out.println(Runtime.getRuntime().availableProcessors());
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(8);
for (int i = 0; i < 10; i++) {
final int index = i;
fixedThreadPool.execute(new Runnable() {
public void run() {
try {
System.out.println(Thread.currentThread().getName() + ">>" + index);
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
}
newScheduledThreadPool
- 具有時間調度特性
- 必須初始化核心線程數
- 底層使用DelayWorkQueue實現延遲特性
newSingleThreadPool
- 核心線程數與最大線程數為1
- 用于不需要并發順序執行
參考鏈接
http://gudong.name/2017/05/03/thread-pool-intro.html
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。