Java執行緒池總結筆記
阿新 • • 發佈:2019-02-17
早上看了篇不錯的介紹執行緒池的文章,細讀了下,筆記如下:
- 使用執行緒池的好處:
- 降低資源消耗
- 提高響應速度
- 提高執行緒可管理性
- 執行緒飽和策略:
- AbortPolicy -直接丟擲異常
- CallerRunsPolicy -只用呼叫者所在的異常來執行任務
- DiscardOldestPolicy -丟棄佇列裡最近的一個任務,並執行當前任務
- DiscardPolicy -不處理,直接丟掉
- 實現RejectedExecutionHandler介面自定義策略
- 兩種向執行緒池提交任務的方式:
- execte方法 -無返回結果(無法判斷執行緒是否被執行成功)
- submit方法 -放回future(根據future的get
- 執行緒關閉的兩種方法
- shutdown方法 -只是將執行緒池的狀態設定成SHUTDOWN狀態,然後中斷所有沒有正在執行任務的執行緒
- shutdownNow方法 -先將執行緒池的狀態設定成STOP,然後嘗試停止所有的正在執行或暫停的任務的執行緒,並返回等待執行任務的列表。
- 執行緒池處理流程:
- 首先執行緒池判斷基本執行緒池(corePoolSize)是否已滿,如果沒滿,則建立一個工作執行緒來執行任務。
- 其次執行緒池判斷工作佇列(runnableTaskQueue)是否已滿,如果沒滿,則將新提交的任務儲存在工作佇列裡。
- 最後執行緒池判斷整個執行緒池(maximumPoolSize)是否已滿,如果沒滿,則建立一個新的工作執行緒來執行任務,如果滿了,則交給飽和策略來處理這個任務。
- 執行緒池的特性分類和對應配置:
- 任務的性質:
- CPU密集型任務(CPU密集型任務配置儘可能小的執行緒)
- IO密集型任務和混合型任務(IO密集型任務配置儘可能多的執行緒)
- 任務的優先順序:高,中和低。--使用優先順序佇列PriorityBlockingQueue來處理
- 任務的執行時間:長,中和短。
- 交給不同規模的執行緒池來處理
- 使用優先順序佇列,讓執行時間短的任務先執行
- 任務的依賴性:是否依賴其他系統資源,如資料庫連線。
- 依賴等待時間越長,執行緒池應該設定越大
- 使用有界佇列而非無界佇列,防止撐爆記憶體
- 任務的性質:
- 執行緒池的監控:
重寫beforeExecute,afterExecute和terminated方法,可以在任務執行前,執行後和執行緒池關閉前做一些事情。