線程池
什么是線程池掉丽?
對線程的一種使用模式
線程池的作用
1.降低系統(tǒng)資源消耗跌榔,頻繁創(chuàng)建和釋放線程對系統(tǒng)的開銷大
2.提高系統(tǒng)響應(yīng)速度,通過直接復(fù)用已創(chuàng)建好的空閑線程捶障,避免了線程創(chuàng)建帶來的時間等待
3.能夠控制線程數(shù)量僧须,防止OOM,同時避免太多線程帶來的cpu時間切換花費
線程池的參數(shù)
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
1.corePoolSize:核心線程數(shù)
2.maximumPoolSize:最大線程數(shù)
3.keepAliveTime:空閑線程的存活時間
4.TimeUnit :空閑線程存活時間的時間單位
5.BlockingQueue:任務(wù)隊列项炼,用來存放超出核心線程數(shù)的任務(wù)担平,默認(rèn)使用的是無界阻塞隊列
6.defaultThreadFactory:線程創(chuàng)建工廠,里面創(chuàng)建線程的方式為new thread()
7.defaultHandler:飽和策略锭部,指的是當(dāng)任務(wù)隊列(此時任務(wù)隊列與線程池使用的都是有界的任務(wù)隊列與一定數(shù)量限制的線程池才有這個問題)與最大線程數(shù)都達到最大值時暂论,對多出來的線程的處理方式
線程池對任務(wù)線程的管理流程
幾種飽和策略:飽和指的是提交的任務(wù)數(shù)超過隊列長度+最大線程數(shù)
1.AbortPolicy :拋出異常
2.DiscardOldestPolicy :當(dāng)任務(wù)添加到線程池中被拒絕時,線程池會放棄等待隊列中最舊的未處理任務(wù)(拋棄下一個將被執(zhí)行的任務(wù))
3.DiscardPolicy:丟棄策略
4.CallerRunsPolicy : 該策略只要線程池未關(guān)閉拌禾,該策略直接在調(diào)用者線程中取胎,運行當(dāng)前被丟棄的任務(wù)
線程池的使用方式:
1.newCachedThreadPool()無限擴大的線程池,能夠及時回收復(fù)用線程湃窍,適合負載較輕闻蛀,執(zhí)行短期異步任務(wù)
ExecutorService executor = Executors.newCachedThreadPool();
2.newFixedThreadPool();固定數(shù)量的線程池您市,對線程數(shù)量進行管控觉痛,防止系統(tǒng)負載過大,適合負載較大的系統(tǒng)
ExecutorService executor = Executors.newFixedThreadPool(2)茵休;
3.newSingleThreadExecutor()薪棒;創(chuàng)建一個單線程的線程池,適合按順序執(zhí)行的任務(wù)
4.newScheduledThreadPool:適用于執(zhí)行延時或者周期性任務(wù)
execute()和submit()方法
提交一個線程任務(wù)
線程池.execute(Runnerable的實現(xiàn)對象)榕莺;
線程池.submit(Runnerable的實現(xiàn)對象/Callable的實現(xiàn)對象)俐芯;
submit()方式提交的任務(wù),傳入Callable實現(xiàn)對象帽撑,有返回值泼各,submit()方法本身會返回FutureTask對象,通過這個對象.get();能夠獲取到返回值亏拉,這個方法是阻塞的扣蜻,知道該任務(wù)執(zhí)行完畢