為什么要用線程池
- 線程的創(chuàng)建和銷毀需要消耗資源 (重復利用線程,減少創(chuàng)建和銷毀的次數(shù))
- 任務到來時蛉抓,需要等待線程的創(chuàng)建庆尘。(提高響應速度)
- 如果無限制地創(chuàng)建,會造成系統(tǒng)的不穩(wěn)定性巷送。(提高線程的可管理性)
工作原理
當一個任務提交過來到線程池驶忌,線程池的處理如下:
- 如果正在執(zhí)行任務的核心線程小于最大的核心線程數(shù)量(corePoolSize),則再創(chuàng)建新線程笑跛;(獲取全局鎖)
- 假如核心線程大于等于核心線程數(shù)量付魔,加入BlockingQueue
- 如果BlockingQueue滿了,而且沒有達到線程池的最大容量(maximumPoolSize)飞蹂,則創(chuàng)建新線程執(zhí)行任務(獲取全局鎖)
- 如果 BlockingQueue滿了几苍,但是如果創(chuàng)建新線程超出maximumPoolSize,任務被拒絕
- keepAliveTime:表示線程沒有任務執(zhí)行時最多保持多久時間會終止陈哑。默認情況下妻坝,只有當線程池中的線程數(shù)大于corePoolSize時,keepAliveTime才會起作用惊窖,直到線程池中的線程數(shù)不大于corePoolSize刽宪,即當線程池中的線程數(shù)大于corePoolSize時,如果一個線程空閑的時間達到keepAliveTime界酒,則會終止纠屋,直到線程池中的線程數(shù)不超過corePoolSize。但是如果調用了allowCoreThreadTimeOut(boolean)方法盾计,在線程池中的線程數(shù)不大于corePoolSize時售担,keepAliveTime參數(shù)也會起作用赁遗,直到線程池中的線程數(shù)為0;
參考
理解ThreadPoolExecutor源碼(一)線程池的corePoolSize族铆、maximumPoolSize和poolSize
深入理解Java之線程池