傳統(tǒng)多線程方案中,一旦接受到請(qǐng)求之后华嘹,即創(chuàng)建一個(gè)新的線程吧趣,由該線程執(zhí)行任務(wù)。任務(wù)執(zhí)行完畢后,線程退出强挫。這就是即時(shí)創(chuàng)建岔霸,即時(shí)銷毀的策略。盡管與創(chuàng)建進(jìn)程相比俯渤,創(chuàng)建線程的時(shí)間已經(jīng)大大的縮短呆细,但是如果提交給線程的任務(wù)執(zhí)行時(shí)間很短,而且執(zhí)行次數(shù)極其頻繁八匠,那么服務(wù)器將處于不停的創(chuàng)建線程絮爷,銷毀線程的狀態(tài)。
t1: 線程創(chuàng)建時(shí)間
t2: 線程執(zhí)行時(shí)間梨树,包括線程的同步等時(shí)間
t3: 線程銷毀時(shí)間
線程本身的開銷所占的比例為(t1+t3)/(t1+t2+t3)坑夯。如果線程執(zhí)行的時(shí)間很短,這筆開銷可能占到20%~50%左右抡四。如果任務(wù)執(zhí)行很頻繁的話柜蜈,這筆開銷將是不可忽略的。
所以引發(fā)了線程池的使用指巡,初始化時(shí)就創(chuàng)建一個(gè)線程池淑履,里面已經(jīng)開好了線程。
定長(zhǎng)線程池就是池子里線程數(shù)是固定的藻雪,任務(wù)排隊(duì)輪流使用秘噪,實(shí)例如下
public static void main(String[] args) throws InterruptedException {
ExecutorService service = Executors.newFixedThreadPool(5); //execute submit
for (int i = 0; i < 6; i++) {
service.execute(() -> {
try {
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//輸出當(dāng)前線程名稱
System.out.println(Thread.currentThread().getName());
});
}
}
QQ圖片20170920181745.png
可以看出第六個(gè)任務(wù)沒有立即執(zhí)行,而是等待有線程空出來(lái)之后才會(huì)執(zhí)行勉耀。