對(duì)于線程池大部分人可能會(huì)用,也知道為什么用。無(wú)非就是任務(wù)需要異步執(zhí)行,再者就是線程需要統(tǒng)一管理起來(lái)。對(duì)于從線程池中獲取線程,大部分人可能只知道,我現(xiàn)在需要一個(gè)線程來(lái)執(zhí)行一個(gè)任務(wù),那我就把任務(wù)丟到線程池里,線程池里有空閑的線程就執(zhí)行,沒(méi)有空閑的線程就等待。實(shí)際上對(duì)于線程池的執(zhí)行原理遠(yuǎn)遠(yuǎn)不止這么簡(jiǎn)單。
在Java并發(fā)包中提供了線程池類(lèi)——ThreadPoolExecutor,實(shí)際上更多的我們可能用到的是Executors工廠類(lèi)為我們提供的線程池:newFixedThreadPool、newSingleThreadPool、newCachedThreadPool,這三個(gè)線程池并不是ThreadPoolExecutor的子類(lèi),關(guān)于這幾者之間的關(guān)系,我們先來(lái)查看ThreadPoolExecutor,查看源碼發(fā)現(xiàn)其一共有4個(gè)構(gòu)造方法。
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)
首先就從這幾個(gè)參數(shù)開(kāi)始來(lái)了解線程池ThreadPoolExecutor的執(zhí)行原理。
corePoolSize:核心線程池的線程數(shù)量
maximumPoolSize:最大的線程池線程數(shù)量
keepAliveTime:線程活動(dòng)保持時(shí)間,線程池的工作線程空閑后,保持存活的時(shí)間。
unit:線程活動(dòng)保持時(shí)間的單位。
workQueue:指定任務(wù)隊(duì)列所使用的阻塞隊(duì)列
corePoolSize和maximumPoolSize都在指定線程池中的