一?JAVA線程池的線程數量配置
? ? ? ? ?關于線程的配置,線程數量配置多少這個問題呢?往往不同的環境與不同的線程中的代碼決定其配置的線程的數量。
二 常見的線程量配置
最常見的方式根據線程中處理的代碼劃分為CPU密集型或IO密集型:
- ?CPU密集型:? 線程池中配置的線程數量 = cpu核數量??
- ?IO密集型就 :? 線程池中配置的線程數量 = cpu核數量? * 2
這就是所謂的通用配置方法,合理嗎?其實我們可以能過調試可以很好知道是否合理。
三 根據情況配置最佳線程數量
? 以下是創建一個線程池的代碼:
private static ExecutorService createThreadPool() {ThreadPoolExecutor threadPool = new ThreadPoolExecutor(32, 100,60L, TimeUnit.SECONDS,new ArrayBlockingQueue<>(1000));threadPool.setThreadFactory(new ThreadFactory() {private final AtomicInteger counter = new AtomicInteger(1);@Overridepublic Thread newThread(Runnable r) {return new Thread(r, "test cpu-" + counter.getAndIncrement());}});return threadPool;}
?這里核心數,也就是線程的數最設置成32,但我本地的環境的cpu是8核的開發機
使用jdk自帶的調式工具jvisualvm.exe 如下圖:
?打開運行后的效果圖:
說明:
? ? ? ?按本地開發機的8核cpu如果按上面的公式應該設置16核才合理,但現在要設置成32個線程數量才全理,如果設置成16線程,并發在11:50:45時就不夠用并且要串聯等待,而整體cpu占用還是非常的小,還有比較大的設置空間,這里每個線程是設備狀態通知相關商家的http請求,如果后續商家繼續增加這里可以結合線程所占用的空閑比,可以繼續優化加大線程量。
四 總結
線程池的數量設計多少,應結合代碼與所運行環境情況配置其運行數量。