監控Java線程池裏的狀態

本文轉自:乾貨:教你如何監控Java線程池運行狀態bash

線程池執行類ThreadPoolExecutor給了相關的API來監控某一個線程池的執行狀態,能實時獲取線程池當前活動線程數、正在排隊線程數、已執行線程數、總線程數等。spa

總線程數 = 排隊線程數 + 活動線程數 + 執行完成的線程數

首先咱們來建立1000個線程的線程池:線程

private static ExecutorService es = new ThreadPoolExecutor(50, 100, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(1000));複製代碼

而後再來寫一個監控方法:code

for (int i = 0; i < 1000; 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);
}複製代碼

執行結果以下:get

11111111111111111111111111111111111111111111111111
當前排隊線程數:950
當前活動線程數:50
執行完成線程數:0
總線程數:1000
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
當前排隊線程數:840
當前活動線程數:50
執行完成線程數:110
總線程數:1000
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
當前排隊線程數:699
當前活動線程數:50
執行完成線程數:251
1總線程數:1000
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1當前排隊線程數:549
當前活動線程數:50
執行完成線程數:401
總線程數:1000
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
當前排隊線程數:400
當前活動線程數:50
執行完成線程數:550
總線程數:1000
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
當前排隊線程數:250
當前活動線程數:50
執行完成線程數:700
總線程數:1000
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
當前排隊線程數:100
當前活動線程數:50
執行完成線程數:850
總線程數:1000
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
當前排隊線程數:0
當前活動線程數:0
執行完成線程數:1000
總線程數:1000
複製代碼

能夠看出:string

活動的線程數和總線程數是不變的,排隊中的和完成的是每次都在變化。it

其中ThreadPoolExecutor提供的API方法以下:io

getQueue().size():獲取當前排隊線程
getActiveCount(): 獲取當前活動的線程
getCompletedTaskCount:已完成的線程
getTaskCount():總線程數複製代碼
相關文章
相關標籤/搜索