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