如果你想監控某一個線程池的執行狀態,線程池執行類 ThreadPoolExecutor
也給出了相關的 API, 能實時獲取線程池的當前活動線程數、正在排隊中的線程數、已經執行完成的線程數、總線程數等。
總線程數 = 排隊線程數 + 活動線程數 + 執行完成的線程數。
1 public class ThreadCount { 2 private static ExecutorService executorService = new ThreadPoolExecutor(50, 3 100,0L, TimeUnit.MILLISECONDS, 4 new LinkedBlockingDeque<Runnable>(100000)); 5 6 public static void main(String[] args) throws Exception { 7 for (int i = 0; i < 100000; i++) { 8 executorService.execute(()->{ 9 System.out.println(1); 10 try { 11 Thread.sleep(1000); 12 } catch (InterruptedException e) { 13 e.printStackTrace(); 14 } 15 }); 16 } 17 ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor)executorService; 18 while (true){ 19 System.out.println("--"); 20 int queueSize = threadPoolExecutor.getQueue().size(); 21 System.out.println("當前排隊線程數:"+queueSize); 22 23 int activeCount = threadPoolExecutor.getActiveCount(); 24 System.out.println("當前活動線程數:"+activeCount); 25 26 long completeTaskCount = threadPoolExecutor.getCompletedTaskCount(); 27 System.out.println("執行完成線程數:"+completeTaskCount); 28 29 long taskCount = threadPoolExecutor.getTaskCount(); 30 System.out.println("總線程數:"+taskCount); 31 32 Thread.sleep(3000); 33 } 34 } 35 36 }
線程池提交了 100000 個任務,但同時只有 50 個線程在執行工作,我們每隔 3 秒來獲取當前線程池的運行狀態。
第一次程序輸出:
總線程數(排隊線程數 + 活動線程數 + 執行完成線程數):100000
第二次程序輸出:
總線程數(排隊線程數 + 活動線程數 + 執行完成線程數):100000
活動線程數和總線程數是不變的,排隊中的線程數和執行完成的線程數不斷在變化,直到所有任務執行完畢,最后輸出:
總線程數(排隊線程數 + 活動線程數 + 執行完成線程數):100000
這樣,你了解了這些 API 的使用方法,你想監控線程池的狀態就非常方便了。