1. 程式人生 > >乾貨:教你如何監控 Java 執行緒池執行狀態

乾貨:教你如何監控 Java 執行緒池執行狀態

之前寫過一篇 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 的使用方法,你想監控執行緒池的狀態就非常方便了。

掃描關注我們的微信公眾號,乾貨每天更新。

image