1.線程池是什么?
2.為什么要使用線程池嚷那,線程池有什么好處私植?
a.復用。重用存在的線程车酣,減少對象的創(chuàng)建、銷毀的開銷索绪,提升性能湖员。
b.可以根據(jù)系統(tǒng)的承受能力,調(diào)整線程池中工作線程的數(shù)目瑞驱,防止消耗過多的內(nèi)存娘摔。
在Java中,如果每當一個請求到達就創(chuàng)建一個新線程唤反,開銷是相當大的凳寺。在實際使用中鸭津,每個請求創(chuàng)建新線程的服務器在創(chuàng)建和銷毀線程上花費的時間和消耗的系統(tǒng)資源,甚至可能要比花在處理實際的用戶請求的時間和資源要多得多肠缨。除了創(chuàng)建和銷毀線程的開銷之外逆趋,活動的線程也需要消耗系統(tǒng)資源。如果在一個JVM里創(chuàng)建太多的線程晒奕,可能會導致系統(tǒng)由于過度消耗內(nèi)存或“切換過度”而導致系統(tǒng)資源不足闻书。為了防止資源不足,服務器應用程序需要一些辦法來限制任何給定時刻處理的請求數(shù)目脑慧,盡可能減少創(chuàng)建和銷毀線程的次數(shù)魄眉,特別是一些資源耗費比較大的線程的創(chuàng)建和銷毀,盡量利用已有對象來進行服務闷袒,這就是“池化資源”技術(shù)產(chǎn)生的原因坑律。?
線程池主要用來解決線程生命周期開銷問題和資源不足問題。通過對多個任務重用線程囊骤,線程創(chuàng)建的開銷就被分攤到了多個任務上了晃择,而且由于在請求到達時線程已經(jīng)存在,所以消除了線程創(chuàng)建所帶來的延遲淘捡。這樣藕各,就可以立即為請求服務,使應用程序響應更快焦除。另外激况,通過適當?shù)卣{(diào)整線程池中的線程數(shù)目可以防止出現(xiàn)資源不足的情況。
把以上的內(nèi)容說清楚膘魄,線程池的好處就算講清楚了乌逐。
3.如何使用
4.一般任務隊列滿了要怎么辦?
5.阻塞隊列是什么创葡,原理是什么浙踢,阻塞隊列滿了怎么辦?
https://blog.csdn.net/qq_16811963/article/details/52194039
http://ifeve.com/java-blocking-queue/
5.1?什么是阻塞隊列灿渴?
阻塞隊列是一個在隊列基礎上又支持了兩個附加操作的隊列洛波。
2個附加操作:
支持阻塞的插入方法:隊列滿時,隊列會阻塞插入元素的線程骚露,直到隊列不滿蹬挤。
支持阻塞的移除方法:隊列空時,獲取元素的線程會等待隊列變?yōu)榉强铡?/p>
5.2 阻塞隊列的實現(xiàn)原理
通知模式實現(xiàn):所謂通知模式棘幸,就是當生產(chǎn)者往滿的隊列里添加元素時會阻塞住生產(chǎn)者焰扳,當消費者消費了一個隊列中的元素后,會通知生產(chǎn)者當前隊列可用。例如ArrayBlockingQueue使用了Condition來實現(xiàn)吨悍。
6.什么場景用什么線程池扫茅,cpu密集型和io密集型都用什么,為什么育瓜?
最后再說說初始化線程池時線程數(shù)的選擇:
如果任務是IO密集型葫隙,一般線程數(shù)需要設置2倍CPU數(shù)以上,以此來盡量利用CPU資源爆雹。
如果任務是CPU密集型停蕉,一般線程數(shù)量只需要設置CPU數(shù)加1即可,更多的線程數(shù)也只能增加上下文切換钙态,不能增加CPU利用率慧起。