圖文并茂講線程池
基本組成
1、線程池管理器(ThreadPool):用于創(chuàng)建并管理線程池,包括 創(chuàng)建線程池,銷毀線程池,添加新任務(wù);
2、工作線程(PoolWorker):線程池中線程,在沒有任務(wù)時(shí)處于等待狀態(tài),可以循環(huán)的執(zhí)行任務(wù);
3、任務(wù)接口(Task):每個(gè)任務(wù)必須實(shí)現(xiàn)的接口,以供工作線程調(diào)度任務(wù)的執(zhí)行,它主要規(guī)定了任務(wù)的入口,任務(wù)執(zhí)行完后的收尾工作,任務(wù)的執(zhí)行狀態(tài)等;
4、任務(wù)隊(duì)列(taskQueue):用于存放沒有處理的任務(wù)。提供一種緩沖機(jī)制。
降低資源消耗。通過重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗。
提高響應(yīng)速度。當(dāng)任務(wù)到達(dá)時(shí),任務(wù)可以不需要的等到線程創(chuàng)建就能立即執(zhí)行。
提高線程的可管理性。使用線程池可以進(jìn)行統(tǒng)一的分配,調(diào)優(yōu)和監(jiān)控,延時(shí)執(zhí)行、定時(shí)循環(huán)執(zhí)行的策略等。

java.uitl.concurrent.ThreadPoolExecutor類是線程池中最核心的一個(gè)類
構(gòu)造參數(shù)
java.uitl.concurrent.ThreadPoolExecutor類是線程池中最核心的一個(gè)類構(gòu)造參數(shù)public ThreadPoolExecutor(???int?corePoolSize,?//該線程池中核心線程數(shù)最大值。線程池新建線程的時(shí)候,如果當(dāng)前線程總數(shù)小于corePoolSize,則新建的是核心線程,如果超過corePoolSize,則新建的是非核心線程??核心線程默認(rèn)情況下會(huì)一直存活在線程池中,即使這個(gè)核心線程啥也不干(閑置狀態(tài))。如果指定ThreadPoolExecutor的allowCoreThreadTimeOut這個(gè)屬性為true,那么核心線程如果不干活(閑置狀態(tài))的話,超過一定時(shí)間(時(shí)長(zhǎng)下面參數(shù)決定),就會(huì)被銷毀掉?????int?maximumPoolSize,//(線程不夠用時(shí)能夠創(chuàng)建的最大線程數(shù))線程總數(shù)?=?核心線程數(shù)?+?非核心線程數(shù)???long?keepAliveTime,?//非核心線程閑置超時(shí)時(shí)長(zhǎng)TimeUnit unit, // keepAliveTime的單位,TimeUnit是一個(gè)枚舉類型BlockingQueueworkQueue, //任務(wù)隊(duì)列:維護(hù)著等待執(zhí)行的Runnable對(duì)象 當(dāng)所有的核心線程都在干活時(shí),新添加的任務(wù)會(huì)被添加到這個(gè)隊(duì)列中等待處理,如果隊(duì)列滿了,則新建非核心線程執(zhí)行任務(wù) ThreadFactory threadFactory, //創(chuàng)建新線程,Executors.defaultThreadFactory()RejectedExecutionHandler handler) //線程池的飽和策略

通過ThreadPoolExecutor.execute(Runnable command)方法即可向線程池內(nèi)添加一個(gè)任務(wù)
當(dāng)一個(gè)任務(wù)被添加進(jìn)線程池時(shí):

1、線程數(shù)量未達(dá)到corePoolSize,則新建一個(gè)線程(核心線程)執(zhí)行任務(wù)
2、線程數(shù)量達(dá)到了corePools,則將任務(wù)移入隊(duì)列BlockingQueue等待
3、如果無法將任務(wù)加入BlockingQueue(隊(duì)列已滿),則在非corePool中創(chuàng)建新的線程來處理任務(wù)(注意,執(zhí)行這一步驟需要獲取全局鎖)。
4、隊(duì)列已滿,總線程數(shù)又達(dá)到了maximumPoolSize,(RejectedExecutionHandler)拋出異常


四種java實(shí)現(xiàn)好的線程池
CachedThreadPool()
可緩存線程池:
線程數(shù)無限制
有空閑線程則復(fù)用空閑線程,若無空閑線程則新建線程
一定程序減少頻繁創(chuàng)建/銷毀線程,減少系統(tǒng)開銷
FixedThreadPool()
定長(zhǎng)線程池:
可控制線程最大并發(fā)數(shù)(同時(shí)執(zhí)行的線程數(shù))
超出的線程會(huì)在隊(duì)列中等待
ScheduledThreadPool()
定長(zhǎng)線程池:
支持定時(shí)及周期性任務(wù)執(zhí)行。
SingleThreadExecutor()
單線程化的線程池:
有且僅有一個(gè)工作線程執(zhí)行任務(wù)
所有任務(wù)按照指定順序執(zhí)行,即遵循隊(duì)列的入隊(duì)出隊(duì)規(guī)則
import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public??class?ThreadPoolExecutorTest?{public static void main(String[] args) {ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);scheduledThreadPool.schedule(new Runnable() {????????????public??void?run()?{System.out.println("delay 3 seconds");}}, 3, TimeUnit.SECONDS);}}

線程池的狀態(tài)




線程池風(fēng)險(xiǎn):
死鎖、資源不足、并發(fā)錯(cuò)誤、 線程泄漏、請(qǐng)求過載
執(zhí)行execute()方法和submit()方法的區(qū)別是什么呢?
execute() 方法用于提交不需要返回值的任務(wù),所以無法判斷任務(wù)是否被線程池執(zhí)行成功與否;
submit()方法用于提交需要返回值的任務(wù)。線程池會(huì)返回一個(gè)future類型的對(duì)象,通過這個(gè)future對(duì)象可以判斷任務(wù)是否執(zhí)行成功,并且可以通過future的get()方法來獲取返回值,get()方法會(huì)阻塞當(dāng)前線程直到任務(wù)完成,而使用
get(long timeout,TimeUnit unit)?方法則會(huì)阻塞當(dāng)前線程一段時(shí)間后立即返回,這時(shí)候有可能任務(wù)沒有執(zhí)行完。
source: //490.github.io/Java多線程與并發(fā)/記得點(diǎn)「贊」和「在看」↓
愛你們
