一、ThreadPoolExecutor的執行緒池中的七個引數解釋,(四個構造方法)
1、corePoolSize-核心執行緒數
在執行緒池空閑時,池中運行的執行緒數;在執行緒池佇列沒有滿時,池中運行的執行緒數;
2、maxPoolSize-最大執行緒數
在執行緒池中的執行緒數量等于核心執行緒且作業佇列已滿時,執行緒池會創建新的執行緒直到該最大的執行緒數,當再有執行緒進來的時候,將拒絕新進執行緒拋出例外(看rejectHandler如何設定)
3、keepAliveTime-執行緒(核心執行緒外的執行緒)存活時間
核心執行緒以外的執行緒在執行緒池中存活時間,(如果allowCoreThreadTimeout設定為true,則所有執行緒均會在存活時間后退出直到為零,一般設定為false)
4、unit-存活時間的單位
空閑執行緒存活時間單位
5、workQueqe - 作業佇列
總有四種佇列:ArrayBlockingQueue,LinkedBlockingQuene,SynchronousQuene,PriorityBlockingQueue;
ArrayBlockingQueue:有界佇列,可以設定佇列大小,如果佇列滿了,將觸發執行緒池中的RejectedHandler策略;
LinkedBlockingQuene: 無界佇列,可以向該佇列無限添加任務,直到記憶體溢位;
SynchronousQuene:阻塞佇列,可以簡單理解成容量只有1的佇列,每個put都必須等到一個take,Executers.newCachedThreadPool使用的這個佇列;
PriorityBlockingQueue:優先級佇列,執行緒池會優先選取優先級高的任務執行,佇列中的元素需要繼承comparable介面,
6、threadFactory - 執行緒工廠
用來設定執行緒名、是否為daemon執行緒,
CustomizableThreadFactory:ThreadFactory threadFactory = new CustomizableThreadFactory("thread-factory-pool-");
ThreadFactoryBuilder:ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("thread-factory-pool-").build();
BasicThreadFactory: ThreadFactory threadFactory = new BasicThreadFactory.Builder.namingPattern("thread-factory-pool-").build();
上述實質等于 Thread thread = new Thread(); thread.setName("thread-factory-pool-");
7、rejectHandler - 拒絕策略
總共有四種拒絕策略:CallerRunsPolicy, AbortPolicy, DiscardPolicy, DiscardOldestPolicy
CallerRunsPolicy:如果添加失敗,將由主執行緒代理執行executor方法;
AbortPolicy:如果添加失敗,將拋出例外RejectedExecutionException;(執行緒池默認策略)
DiscardPolicy:如果添加失敗,直接丟棄掉,不拋棄例外;
DiscardOldestPolicy:如果添加失敗,將佇列中最早添加的元素移除,再次添加,如果添加失敗繼續上述操作;
二、JDK四個預定義執行緒池(jdk1.5之后)
1、newFixedThreadPool-固定數量的執行緒池
它是一種固定大小的執行緒池,corePoolSize和maximunPoolSize都為用戶設定的執行緒數量nThreads,keepAliveTime為0,意味著一旦有多余的空閑執行緒,就會被立即停止掉;但這里keepAliveTime無效,阻塞佇列采用了LinkedBlockingQueue,它是一個無界佇列;由于阻塞佇列是一個無界佇列,因此永遠不可能拒絕任務,由于采用了無界佇列,實際執行緒數量將永遠維持在nThreads,因此maximumPoolSize和keepAliveTime將無效,
public static ExecutorService newFixedThreadPool(int nThreads){
return new ThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
}
2、newCachedThreadPool-快取執行緒池
它比較適合處理執行時間比較小的任務;corePoolSize為0,maximumPoolSize為無限大,意味著執行緒數量可以無限大;keepAliveTime為60S,意味著執行緒空閑時間超過60S就會被殺死;采用SynchronousQueue裝等待的任務,這個阻塞佇列沒有存盤空間,這意味著只要有請求到來,就必須要找到一條作業執行緒處理他,如果當前沒有空閑的執行緒,那么就會再創建一條新的執行緒,
public static ExecutorService newCachedThreadPool(){
return new ThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.MILLISECONDS,new SynchronousQueue<Runnable>());
}
3、scheduledThreadPool
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue());
}
定時功能實作:scheduleAtFixedRate(command, initialDelay, period, unit)
command: 執行的執行緒(可自己New一個)
initialDelay:初始化執行的延時時間
period: 時間間隔
unit : 時間型別
stThread.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println(new Date());
}
}, 20, 2, TimeUnit.SECONDS);
延時功能實作:
callable:回呼方法
delay:延時時間
unit:時間型別 , 同定時器的unit一樣
stThread.schedule((RolePrvlegeTask)SpringUtils.getBean("rolePrvlegeTask"), 1, TimeUnit.SECONDS);
4、SingleThreadExecutor
public static ExecutorService newSingleThreadExecutor(){
return new ThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/263804.html
標籤:java
下一篇:Java代理
