概述
在對數據庫操作時,有連接池的概念,比如:C3P0連接池、德魯伊連接池。而ExecutorService本質上是線程池。無論連接池也好,線程池也好,它們存在的主要意義就是減少頻繁創建和銷燬資源的頻率,達到提高資源的利用率的目地。
可以將ExecutorService簡單稱作:執行器服務。
主要內容
核心線程隊列
核心線程隊列是ExecutorService最主要的部分,對外提供核心線程,供調用者使用。核心線程使用完之後不會被銷燬,繼續等待下一個請求。
工作隊列
當核心線程隊列已滿,並且都被佔用時,就將新的獲取線程的請求放到該隊列中等待。
臨時隊列
當工作隊列也被塞滿時,將向外界提供臨時隊列的線程。臨時隊列用完時會銷燬,但不是立即銷燬,當隔一段時間沒有新的請求時再銷燬。
拒絕執行處理器
有一種極端情況,就是核心線程隊列、工作隊列、臨時隊列都放滿時,如果再有新的請求,將由拒絕執行處理器負責處理。
代碼實現
package liwen.zhao;
import java.util.concurrent.*;
public class ExcutorServiceDemo {
public static void main(String[] args) {
//創建4個核心線程隊列、12-4=8個臨時線程隊列、臨時線程存活時間2秒、5個工作隊列、拒絕執行處理器(可選)
ExecutorService executorService=new ThreadPoolExecutor(4, 12, 2, TimeUnit.SECONDS, new ArrayBlockingQueue<>(5), new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.out.println(r.toString()+"被拒絕了");
}
});
for (int i=0;i<20;i++){
executorService.execute(new MyThread());
}
}
}
class MyThread implements Runnable{
@Override
public void run() {
System.out.println("線程執行了~");
}
}
執行結果:
liwen.zhao.MyThread@29453f44被拒絕了
liwen.zhao.MyThread@5cad8086被拒絕了
liwen.zhao.MyThread@6e0be858被拒絕了
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~
線程執行了~