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