java執行緒池的原理
阿新 • • 發佈:2018-12-24
實現架構
頂層:介面Executor,預設只有一個executor方法,void
第二層介面:ExecutorService繼承Executor介面,定義一些執行執行緒池的方法
第三層:實現類:AbstractExecutorService抽象類,和介面SchedleExecutorService
第四層:實現類核心類,ThreadPoolExecutor
如何建立一個執行緒池
- javac推薦使用Executors類中的靜態方法
newSingleThreadExecutor()單個執行緒池
newFixThreadPool(int size)固定大小的執行緒池
newCacheThreadPool()建立一個緩衝池,緩衝池容量大小為Integer.MAX_VALUE
newScheduleThreadPool()建立一個週期性 - 自己定義一個執行緒
public class Test {
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(5));
for(int i=0;i<15;i++){
MyTask myTask = new MyTask(i);
executor.execute(myTask);
System.out.println("執行緒池中執行緒數目:"+executor.getPoolSize()+",佇列中等待執行的任務數目:"+
executor.getQueue().size()+",已執行玩別的任務數目:"+executor.getCompletedTaskCount());
}
executor.shutdown();
}
}
class MyTask implements Runnable {
private int taskNum;
public MyTask(int num) {
this.taskNum = num;
}
@Override
public void run() {
System.out.println("正在執行task "+taskNum);
try {
Thread.currentThread().sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("task "+taskNum+"執行完畢");
}
}
ThreadPoolExecutor核心類引數
corePoolSize:核心執行緒數量
MaxNumPoolSize,執行緒池最大執行緒數量
keepAliveTime:空閒執行緒最大存活時間
unit:列舉類,時間單位,houror,mininute,second,毫秒,微妙,納秒
workQueue:阻塞佇列,用於存放當核心執行緒數達到峰值時,存放的執行緒,一般有ArrayBlockingQueue,LinkedBlockingQueue和SychronousQueue
如何執行
兩種方式:
預設介面實現的executor()方法,該方法沒有返回值
submit(),在ExecutorServcie介面定義,由AbstractExecutorService實現,其實還是呼叫executor方法,只是返回結果封裝了Future物件
執行緒池呼叫執行緒策略
- 當執行一個執行緒後,先判斷當前執行緒數是否大於corePoolSize,如果小於則重現建立一個執行緒去處理
- 當執行緒數目大於或等於corePoolSize,則將執行緒存入阻塞佇列中,等待有空閒執行緒出現;
- 如果佇列執行緒已滿,則建立新的執行緒去執行;
- 當執行緒數達到maxPoolSize時,啟動任務拒絕策略,這個由人工設定,一般預設設定拋異常,RejectExecutionException;
執行緒池的作用
- 執行緒複用
定義一個worker類,然後啟動執行緒執行runWorker方法,迴圈獲取getTask()阻塞佇列中的runnable任務 - 控制最大併發數
- 管理執行緒