分享一下最近優銳課學習筆記。緩存
Java線程池執行程序偏向於排隊而不是產生新線程。從好的方面來講,咱們有兩種解決方法。多線程
理想狀況下,對任何線程池執行程序而言,指望以下:學習
下圖描述了該過程;僅建立初始線程來處理任務(負載很低時)。編碼
隨着更多的任務進入,假設建立的線程總數小於最大池大小,則會建立更多的線程來處理負載(任務隊列仍然爲空)。線程
若是任務總數大於線程總數(初始+擴展),則任務隊列開始填充:blog
不幸的是,Java線程池執行器(TPE)偏向於排隊而不是生成新線程,即,在初始核心線程被佔用以後,任務被添加到隊列中,而且在隊列達到其限制以後(這隻會在有界隊列中發生) ),則會產生額外的線程。若是隊列不受限制,則徹底不會產生擴展線程,以下圖所示。隊列
這是TPE中的代碼,出現了問題io
咱們有兩種解決方法:擴展
將corePoolSize 和maximumPoolSize設置爲相同的值,並將allowCoreThreadTimeOut 設置爲true。線程池
實現自定義RejectedExecutionHandler以始終添加到位數中。
使用自定義隊列(TransferQueue)並覆蓋offer方法以執行如下操做:
使用專門用於此目的的自定義線程池執行程序。它使用系統@ Facebook規模中所述的LIFO調度。