1. 程式人生 > >java執行緒池的原理

java執行緒池的原理

實現架構

頂層:介面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

如何執行

兩種方式:

  1. 預設介面實現的executor()方法,該方法沒有返回值

  2. submit(),在ExecutorServcie介面定義,由AbstractExecutorService實現,其實還是呼叫executor方法,只是返回結果封裝了Future物件

執行緒池呼叫執行緒策略

  1. 當執行一個執行緒後,先判斷當前執行緒數是否大於corePoolSize,如果小於則重現建立一個執行緒去處理
  2. 當執行緒數目大於或等於corePoolSize,則將執行緒存入阻塞佇列中,等待有空閒執行緒出現;
  3. 如果佇列執行緒已滿,則建立新的執行緒去執行;
  4. 當執行緒數達到maxPoolSize時,啟動任務拒絕策略,這個由人工設定,一般預設設定拋異常,RejectExecutionException;

執行緒池的作用

  1. 執行緒複用
    定義一個worker類,然後啟動執行緒執行runWorker方法,迴圈獲取getTask()阻塞佇列中的runnable任務
  2. 控制最大併發數
  3. 管理執行緒