1. 程式人生 > >Java執行緒池總結筆記

Java執行緒池總結筆記

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

重寫beforeExecuteafterExecuteterminated方法,可以在任務執行前,執行後和執行緒池關閉前做一些事情。