Jdk原生線程池
- 容易誤解的地方:core線程已滿的情況下,先放queue,queue也滿了的情況下,才會(huì)擴(kuò)建線程,直到maxSize后,才執(zhí)行拒絕策略;

image.png
- 提交task,都發(fā)生了什么呢?
- 當(dāng)已創(chuàng)建的線程數(shù)小于coreSize時(shí),add new worker;
- 當(dāng)大于coreSize時(shí),新提交的task放入queue中,等待消費(fèi);
- 當(dāng)queue滿了時(shí),繼續(xù)add new worker,最多創(chuàng)建max個(gè)worker
-
worker負(fù)責(zé)執(zhí)行task,worker有一個(gè)for;;無(wú)限循環(huán)過(guò)程,不斷從queue中獲取task,如果task沒(méi)有時(shí),可以阻塞get或者get null;
image.png
- 可能的坑
- task執(zhí)行耗時(shí)太長(zhǎng)導(dǎo)致線程池吞吐量太低,大量task被reject
- 線程池可以在初始化時(shí)即預(yù)熱線程,因?yàn)樘峤籺ask是同步方法,導(dǎo)致等鎖擠壓;
- Executors提供的幾個(gè)常用常用的線程池,queue的size都是Integer.Max,如果消費(fèi)的慢,很容易o(hù)om
