Java多線程之監控Java線程池運行狀態


如果你想監控某一個線程池的執行狀態,線程池執行類 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 的使用方法,你想監控線程池的狀態就非常方便了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM