其實(shí)java線程池的實(shí)現(xiàn)原理很簡(jiǎn)單,說(shuō)白了就是一個(gè)線程集合workerSet和一個(gè)阻塞隊(duì)列workQueue。當(dāng)用戶向線程池提交一個(gè)任務(wù)(也就是線程)時(shí),線程池會(huì)先將任務(wù)放入workQueue中。workerSet中的線程會(huì)不斷的從workQueue中獲取線程然后執(zhí)行。當(dāng)workQueue中沒有任務(wù)的時(shí)候,worker就會(huì)阻塞,直到隊(duì)列中有任務(wù)了就取出來(lái)繼續(xù)執(zhí)行。
當(dāng)一個(gè)任務(wù)提交至線程池之后:
1. 線程池首先當(dāng)前運(yùn)行的線程數(shù)量是否少于corePoolSize。如果是,則創(chuàng)建一個(gè)新的工作線程來(lái)執(zhí)行任務(wù)。如果都在執(zhí)行任務(wù),則進(jìn)入
2. 判斷BlockingQueue是否已經(jīng)滿了,倘若還沒有滿,則將線程放入BlockingQueue。否則進(jìn)入
3. 如果創(chuàng)建一個(gè)新的工作線程將使當(dāng)前運(yùn)行的線程數(shù)量超過maximumPoolSize,則交給RejectedExecutionHandler來(lái)處理任務(wù)。
當(dāng)ThreadPoolExecutor創(chuàng)建新線程時(shí),通過CAS來(lái)更新線程池的狀態(tài)ctl。