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