1. 程式人生 > >線程池技術

線程池技術

ren 拒絕策略 一個 thread join 有意 策略 ont 使用

  • 在服務器負載過大,如何讓新的線程等待或者友好的拒絕服務?
    • 簡單方式使用線程池
    • 開源技術guava、hystrix
  • 線程池的基本作用
    • 利用線程池管理並復用線程、控制最大並發數
    • 實現任務線程隊列緩存策略和拒絕機制
    • 實現某些與時間相關的功能
      • 定時執行
      • 周期執行
    • 隔離線程環境
      • 比如交易服務和搜索服務在同一臺服務器上
  • ThreadPoolExecutor核心參數
    • corePoolSize
      • 常駐核心線程數
      • 等於0,任務執行完即銷毀
      • 大於0,任務執行完,核心線程也不會被銷毀
    • maximumPoolSize
      • 線程池能容納同時執行的最大線程數
      • 如果待執行的線程數大於此值,需要借助workQueue緩存在隊列中。
    • keepAliveTime
      • 線程池中的線程空閑時間
      • 空閑線程達到這個值時,線程會被銷毀,直到只剩下corePoolSize個線程為止
      • 避免浪費內存和句柄資源
    • TimeUnit
      • 時間單位
      • keepAliveTime時間單位通常時秒
    • workQueue
      • 緩存隊列
      • 請求線程數大於maximumPoolSize時,線程進入BlockingQueue阻塞隊列。是一個生產消費模型隊列。
    • threadFactory
      • 線程工廠,用來生產一組相同任務的線程
    • handler
      • 執行拒絕策略的對象
      • 當超過workQueue的任務緩存區上限後,就可以通過該策略處理請求,這是一種簡單的限流保護。
      • 三種友好的拒絕策略
        • 保存到數據庫進行削峰填谷,空閑時再提取出來
        • 轉向某個提示頁面
        • 打印日誌
  • Executors的5個核心方法
    • newSingleThreadPool
      • 保證按任務的提交順序依次執行
      • 無界隊列,瞬時請求非常大,會有OOM風險
      • 返回ThreadPoolExecutor線程池對象
    • newFixedThreadPool
      • 核心線程數也是最大可執行線程數
      • 不存在空閑線程
      • keepAliveTime等於0
      • 無界隊列,瞬時請求非常大,會有OOM風險
      • 返回ThreadPoolExecutor線程池對象
    • newCachedThreadPool
      • maximumPoolSize最大可以至Integer.MAX_VALUE,如果達到這個上限,沒有任何服務器能夠正常工作,存在OOM風險。
      • 回收工作線程
      • 返回ThreadPoolExecutor線程池對象
    • newScheduledThreadPool
      • 線程數最大可以至Integer.MAX_VALUE,存在OOM風險
      • 不回收工作線程
      • 返回ScheduledThreadPoolExecutor線程池對象
    • newStealingThreadPool
      • JDK8引入的新線程池對象
      • 支持給定的並行度,默認CPU數量
      • 使用多個隊列減少競爭
      • 返回ForkJoinPool線程池對象
  • 自定義實現ThreadFactory
    • 一定要有特定意義的名稱,方便問題回溯
      • 如調用來源、線程的業務含義
    • 統一用newThread獲取線程
      • 保存名稱前綴+AtomicInteger
  • 自定義實現RejectedExecutionHandler
    • 打印當前線程池的狀態
  • 使用線程池註意事項
    • 合理設置線程池參數,根據實際業務場景來決定工作線程數
    • 線程資源必須通過線程池提供,不允許在應用中自行顯示創建線程
      • 不允許使用Executors
      • 推薦直接使用ThreadPoolExecutor的方式創建,這樣能更加明確線程池的運行規則,避免資源耗盡。
    • 創建線程或線程池要指定有意義的名字,方便問題回溯

線程池技術