教你如何監控 Java 線程池運行狀態
阿新 • • 發佈:2018-06-25
如何 row ima stat nsh es.exe 關註 for spring 之前寫過一篇 Java 線程池的使用介紹文章《線程池全面解析》,全面介紹了什麽是線程池、線程池核心類、線程池工作流程、線程池分類、拒絕策略、及如何提交與關閉線程池等。
但在實際開發過程中,在線程池使用過程中可能會遇到各方面的故障,如線程池阻塞,無法提交新任務等。
如果你想監控某一個線程池的執行狀態,線程池執行類 ThreadPoolExecutor
也給出了相關的 API, 能實時獲取線程池的當前活動線程數、正在排隊中的線程數、已經執行完成的線程數、總線程數等。
總線程數 = 排隊線程數 + 活動線程數 + 執行完成的線程數。
下面給出一個線程池使用示例,及教你獲取線程池狀態。
private static ExecutorService es = new ThreadPoolExecutor(50, 100, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(100000)); public static void main(String[] args) throws Exception { for (int i = 0; i < 100000; i++) { es.execute(() -> { System.out.print(1); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }); } ThreadPoolExecutor tpe = ((ThreadPoolExecutor) es); while (true) { System.out.println(); int queueSize = tpe.getQueue().size(); System.out.println("當前排隊線程數:" + queueSize); int activeCount = tpe.getActiveCount(); System.out.println("當前活動線程數:" + activeCount); long completedTaskCount = tpe.getCompletedTaskCount(); System.out.println("執行完成線程數:" + completedTaskCount); long taskCount = tpe.getTaskCount(); System.out.println("總線程數:" + taskCount); Thread.sleep(3000); } }
線程池提交了 100000 個任務,但同時只有 50 個線程在執行工作,我們每陋 3 秒來獲取當前線程池的運行狀態。
第一次程序輸出:
當前排隊線程數:99950
當前活動線程數:50
執行完成線程數:0
總線程數(排隊線程數 + 活動線程數 + 執行完成線程數):100000
第二次程序輸出:
當前排隊線程數:99800
當前活動線程數:50
執行完成線程數:150
總線程數(排隊線程數 + 活動線程數 + 執行完成線程數):100000
活動線程數和總線程數是不變的,排隊中的線程數和執行完成的線程數不斷在變化,直到所有任務執行完畢,最後輸出:
當前排隊線程數:0 當前活動線程數:0 執行完成線程數:100000 總線程數(排隊線程數 + 活動線程數 + 執行完成線程數):100000
這樣,你了解了這些 API 的使用方法,你想監控線程池的狀態就非常方便了。
推薦:Spring Boot & Cloud 最強技術教程
掃描關註我們的微信公眾號,幹貨每天更新。
教你如何監控 Java 線程池運行狀態