Java線程池使用時須要注意的幾點

線程池做用

  • CPU資源隔離
  • 減小上下文切換
  • 減小線程建立/關閉的資源開銷
  • 更好併發控制
  • 更好生命週期控制

設計時注意事項

設計時,需注意:安全

  • 任務混雜
  • 任務依賴
  • 飢餓死鎖
  • 慢操做

使用時注意事項

線程池參數

  • 核心池大小(core pool size)
  • 最大池的大小(maximum pool size)
    • 核心池滿
    • 隊列滿
  • 存活時間(keep-alive time)

任務隊列(BlockingQueue)

  • 無限隊列
    • LinkedBlockingQueue
      • newSingleThreadExecutor
      • newFixedThreadPool
  • 有限隊列
    • ArrayBlockingQueue
    • LinkedBlockingQueue(int capacity)
    • 飽和策略
      • setRejectedExecutionHandler
      • ThreadPoolExecutor.AbortPolicy
        • 停止策略(默認)
        • 拋出RejectedExecutionException
        • 調用者捕獲後,自行實現邏輯
      • ThreadPoolExecutor.CallerRunsPolicy
        • 不丟棄任務
        • 不拋出異常
        • 把任務退回調用者線程執行(同步調用)
      • ThreadPoolExecutor.DiscardOldestPolicy
        • 遺棄最舊的任務
        • 選擇本應該接下來就要執行的任務
          • 會嘗試再次提交
        • 若是使用優先級隊列,則丟棄優先級最高的元素
        • 配合SynchronousQueue使用,能夠實現任務提交併等待的效果
      • ThreadPoolExecutor.DiscardPolicy
        • 遺棄策略
        • 放棄這個任務
      • 能夠結合Semaphore使用
        • 限制任務注入率(injection rate)
    • FIFO
  • 同步移交(synchronous handoff)
    • 直接傳遞給其餘線程
    • SynchronousQueue
      • newCachedThreadPool

線程工廠

  • 設置異常處理
    • UncaughtExceptionHandler
  • 設置線程名稱
  • 優先級(不建議)
  • 守護線程(不建議)
  • 增長額外的計數器
  • 增長額外的統計信息
  • Executors.privilegedThreadFactory()
    • 使用建立線程的安全策略,ClassLoader

不可再配置

  • 防止ExecutorService被外部調用setting方法,從而修改了線程池配置
  • Executors.unconfigurableExecutorService()

線程池擴展點

  • ThreadPoolExecutor
    • beforeExecutor
    • afterExecutor
    • terminate

執行策略

  • 執行任務,不關心結果
    • void execute(Runnable command)
  • 執行任務,須要對結果進行處理
    • Future submit(Callable task)
    • Future submit(Runnable task)
    • Future submit(Runnable task, T result)
  • 執行一批任務,須要所有成功完成
    • List<Future> invokeAll(Collection<? extends Callable<T>> tasks)
    • List<Future> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
  • 執行一批任務,只須要有一個成功完成便可
    • T List<Future> invokeAny(Collection<? extends Callable<T>> tasks)
    • T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
  • 執行一批任務,須要逐個處理結果
    • CompletionService
      • ExecutorCompletionService
相關文章
相關標籤/搜索