1. 程式人生 > >執行緒池專題(二)

執行緒池專題(二)

1.建立執行緒池的建構函式:

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectExecutionHandler handler);

corePoolSize:執行緒池的大小,這個引數跟後面講述的執行緒池的實現原理有非常大的關係。在建立了執行緒池後,預設情況下,執行緒池中並沒有任何執行緒,而是等待有任務到來才建立執行緒去執行任務,除非呼叫了prestartAllCoreThreads()或者prestartCoreThread()方法,從這2個方法的名字就可以看出,是預建立執行緒的意思,即在沒有任務到來之前就建立corePoolSize個執行緒或者一個執行緒。預設情況下,在建立了執行緒池之後,

執行緒池中的執行緒數為0,當有任務來之後,就會建立一個執行緒去執行任務,當執行緒池中的執行緒數目達到corePoolSize後,就會把到達的任務放到快取隊列當中;

 

maximumPoolSize:執行緒池最大執行緒數,這個引數也是一個非常重要的引數,它表示線上程池中最多能建立多少個執行緒;

 

keepAliveTime:表示執行緒沒有任務執行時最多保持多久時間會終止。預設情況下,只有當執行緒池中的執行緒大於corePoolSize時,keepAliveTime才會起作用,直到執行緒池中的執行緒數不大於corePoolSize,即當執行緒池中的執行緒數大於corePoolSize時,如果一個執行緒空閒的時間達到keepAliveTime,則會終止,直到執行緒池中的執行緒不超過corePoolSize。但是如果呼叫了allowCoreThreadTimeOut(boolean)方法,線上程池中的執行緒不大於corePoolSize時,keepAliveTime引數也會起作用,直到執行緒池中的執行緒數為0;

 

unit:引數keepAliveTime的時間單位,有7中取值,在TimeUnit類中有7中靜態屬性:

       TimeUnit.DAYS;                              //天

       TimeUnit.HOURS;                          //小時

       TimeUnit.MINUTES;                       //分鐘

       TimeUnit.SECONDS;                     //秒

       TimeUnit.MILLISECONDS;            //毫秒

       TimeUnit.MICROSECONDS;         //微秒

       TimeUnit.NANOSECONDS;          //納秒

 

workQueue:一個阻塞佇列,用來儲存等待執行的任務,workQueue的型別為BlockingQueue<Runnable>,通常可以取下面三種類型:

       ArrayBlockingQueue;基於陣列的先進先出佇列,此佇列建立時必須指定大小;

       LinkedBlockingQueue;基於連結串列的先進先出佇列,如果建立時沒有指定此佇列大小,則預設為Integer.MAX_VALUE;

       SynchronousQueue;這個佇列比較特殊,它不會儲存提交的任務,而是將直接新建一個執行緒來執行新來的任務。

  備註:ArrayBlockingQueue和PriorityBlockingQueue使用較少,一般使用LinkedBlockingQueue和Synchronous.執行緒池的排隊策略與BlockingQueue有關。

 

threadFactory:執行緒工廠,主要用來建立執行緒;

 

handler:表示當拒絕處理任務時的策略,有以下四種取值:

       ThreadPoolExecutor.AbortPolicy:丟棄任務並丟擲RejectedExecutionException異常。

       ThreadPoolExecutor.DiscardPolicy:也是丟棄任務,但是不拋棄異常。

       ThreadPoolExecutor.DiscardOldestPolicy:丟棄佇列最前面的任務,然後重新嘗試執行任務(重複此過程)

       ThreadPoolExecutor.CallRunsPolicy:由呼叫執行緒處理該任務

 

https://www.cnblogs.com/dolphin0520/p/3932921.html