使用線程池的注意事項
死鎖
任何多線程程序都有死鎖的風險,最簡單的情形是兩個線程AB,A持有鎖1,請求鎖2,B持有鎖2,請求鎖1。(這種情況在mysql的排他鎖也會出現,不會數據庫會直接報錯提示)。線程池中還有另一種死鎖:假設線程池中的所有工作線程都在執行各自任務時被阻塞,它們在等待某個任務A的執行結果。而任務A卻處于隊列中,由于沒有空閑線程,一直無法得以執行。這樣線程池的所有資源將一直阻塞下去,死鎖也就產生了。
系統資源不足
如果線程池中的線程數目非常多,這些線程會消耗包括內存和其他系統資源在內的大量資源,從而嚴重影響系統性能。
并發錯誤
線程池的工作隊列依靠wait()和notify()方法來使工作線程及時取得任務,但這兩個方法難以使用。如果代碼錯誤,可能會丟失通知,導致工作線程一直保持空閑的狀態,無視工作隊列中需要處理的任務。因為最好使用一些比較成熟的線程池。
線程泄漏
使用線程池的一個嚴重風險是線程泄漏。對于工作線程數目固定的線程池,如果工作線程在執行任務時拋出RuntimeException或Error,并且這些異常或錯誤沒有被捕獲,那么這個工作線程就異常終止,使線程池永久丟失了一個線程。(這一點太有意思)
另一種情況是,工作線程在執行一個任務時被阻塞,如果等待用戶的輸入數據,但是用戶一直不輸入數