天天看點

幹貨:教你如何監控 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 的使用方法,你想監控線程池的狀态就非常友善了。

推薦:

Spring Boot & Cloud 最強技術教程

掃描關注我們的微信公衆号,幹貨每天更新。

image