1. 線程池的做用緩存
線程池的創建爲線程生命週期開銷問題和資源不足問題提供瞭解決方案。經過對多個任務重用線程,線程建立的開銷被分攤到了多個任務上。其好處是,由於在請求到達時線程已經存在,因此無心中也消除了線程建立所帶來的延遲。這樣,就能夠當即爲請求服務,使應用程序響應更快。並且,經過適當地調整線程池中的線程數目,也就是當請求的數目超過某個閾值時,就強制其它任何新到的請求一直等待,直到得到一個線程來處理爲止,從而能夠防止資源不足。併發
2. 使用線程池的風險線程
死鎖 (全部線程池都在執行一個在等待隊列任務的執行結果)生命週期
資源不足 (線程池大小設置不合理形成資源不足)隊列
併發錯誤 (線程池和其它排隊機制依靠使用 wait() 和 notify() 方法,這兩個方法都難於使用,形成併發錯誤)資源
線程泄露 (a. 當線程在任務完成後沒有返回池。b. 當發生RuntimeException異常或Error時,線程池沒有捕捉到它們時。)it
請求過載 (請求過多)io
經常使用的幾種線程池效率
- newCachedThreadPool線程池
這是一種可緩存線程池,若是線程長度超過處理需求,可靈活回收空閒線程,若無可回收,則新建線程。
特色
(1). 建立數量幾乎沒有限制(可經過Interger.MAX_VALUE調整)
(2). 若長時間沒有提交任務,則該工做線程將自動終止(默認空閒時間爲1分鐘)。結束後,須要從新建立。
(3). 須要控制任務的數量,過大容易形成系統癱瘓。
- newFixedThreadPool
建立一個指定工做線程數量的線程池,每當提交一個任務就建立一個工做線程,若是工做線程數量達到線程池初始的最大數,則將提交的任務存入到池隊列中。優勢:可以提升程序效率和節省建立線程時所耗的開銷,缺點:當沒有可執行任務時,它不會釋放工做線程,還會佔用一頂的系統資源。
- newSingleThreadExcutor
建立一個單線程化的Executor(惟一的工做者線程),保證全部任務按照指定順序(FIFO,LIFO,優先級)執行,若是出現異常,則會有另外一個線程代替它,最大優勢和特色就是保證順序執行各個任務,而且在任意給定的時間不會有多個線程時活動的。
- newScheduleThreadPool
建立一個定長的線程池,且支持定時及週期性任務執行。