作為一個程序員,平時關于線程也是使用的肯定很頻繁,舉個例子開啟無數線程跑的同時就好像一個沒有紅綠燈的十字路口無數的汽車在通行,結局可想而知,而本文就是介紹多線程的管理者ThreadPoolExecutor線程池。
java多線程池的支持——ThreadPoolExecutor
ThreadPoolExecture實現原理
Step1:調用execute方法創(chuàng)建新線程,首先檢查CorePool 核心線程數量,如果少于CorePoolSize則去創(chuàng)建新的線程,反之則進入Step2
Step2:CoolPool內線程數量已滿,則將線程加入BlockingQueue(等待隊列)如果BlockingQueue已滿則進入Step3
Step3:如果池中的線程數量大于CorePoolSize,BlockingQueue已滿,并且
1.線程池中數量小于corepoolsize,則創(chuàng)建新線程去執(zhí)行任務
2.線程池中數量等于corepoolsize,通過handler指定的策略來處理此任務,優(yōu)先級:核心線程coopoolsize,任務隊列workqueue,最大線程maximumPoolSize,三者都滿了之后,使用handler處理被拒絕的任務
3.線程池中數量大于corepoolsize,如果某個線程執(zhí)行完空閑時間超過keepAliveTime的時間該線程將被終止,線程池調整池中線程數
關于線程池的構造方法:
publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,
????TimeUnit unit,BlockingQueue workQueue,ThreadFactory ????threadFactory,RejectedExecutionHandler handler) {
????????if(corePoolSize <0|| maximumPoolSize<=0||maximumPoolSize< corePoolSize ||? ?keepAliveTime <0)throw newIllegalArgumentException();
? ? ? ?if(workQueue ==null|| threadFactory ==null|| handler ==null)throw newNullPointerException();
? ? ? ?this.corePoolSize= corePoolSize;
? ? ? ?this.maximumPoolSize=maximumPoolSize;
? ? ? ?this.workQueue= workQueue;
? ? ? ?this.keepAliveTime= unit.toNanos(keepAliveTime);
? ? ? ?this.threadFactory= threadFactory;
? ? ? ?this.handler= handler;
}
構造方法參數解釋
corePoolSize ?線程池核心線程數量
maximumPoolSize 線程池最大容量大小
keepAliveTime ?線程池維護線程的空閑時間
TimeUnit unit時間單位
BlockingQueue workQueue ?等待隊列
ThreadFactory ?線程工廠
RejectedExecutionHandler 拒絕策略
對于一些參數的理解:
關于blockQueue:
1.ArrayBlockingQueue ? ? ?有界隊列,基于數據結構的數組類型等待隊列,先進先出,newArrayBlockingQueue(?) ?定義隊列長度。
2.LinkedBlockingQueue ? ?無界隊列,基于鏈表結構的等待隊列,先進先出,吞吐量大于ArrayBlockingQueue。
3.syncchronousQueue ? ? 直接提交,一個不存儲元素的工作阻塞隊列,前一個線程對象不調用移除操作完全移除之后,后一個線程將一直處于阻塞狀態(tài)即前一個任務完成之后才會執(zhí)行下一個任務,吞吐量大于LinkedBlockingQueue,Executors.newCachedThreadPool使用了此阻塞隊列
4.priorityQueue? ? ? ? ? ? ? ? 一個具有無限優(yōu)先級的阻塞隊列
關于threadfactory
創(chuàng)建線程的工廠
關于拒絕策略rejectedExecutionHandler
當隊列和線程池都滿了,說明線程池處于飽和狀態(tài),這時候我們需要通過handler執(zhí)行拒絕策略,無法處理新建線程時向執(zhí)行。四種策略:
1.ThreadPoolExecutor.AbortPolicy:丟棄任務并拋出RejectedExecutionException異常。
2.ThreadPoolExecutor.DiscardPolicy:也是丟棄任務,但是不拋出異常。
3.ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊列最前面的任務,然后重新嘗試執(zhí)行任務(重復此過程)
4.ThreadPoolExecutor.CallerRunsPolicy:由調用線程處理該任務
啟動線程池
一個線程任務通過ThreadPool.excute(new Runnable)添加執(zhí)行。任務執(zhí)行的方法就是Runnable對象的run方法,使用excute適用于提交不需要返回值的任務,當需要提交返回值的任務時需要使用submit()方法。
關閉線程池
原理:遍歷線程池中的所有工作線程,然后調用線程的interrupt方法終止線程,所以無法響應中斷的線程將永遠無法停止。
1.shutdownnow
將線程職為STOP狀態(tài),然后嘗試停止所有正在執(zhí)行或者短暫暫停的線程,并返回正在等待的任務隊列。
2.shutdown
將線程置為SHUTDOWN狀態(tài),然后中斷所有沒有正在執(zhí)行的工作線程。
關于介紹暫時到這邊,后續(xù)繼續(xù)努力!