本文轉自:乾貨:教你如何監控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():總線程數複製代碼