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