Java-技術專區-如何監控Java線程池的狀態


線程池介紹

  什么是線程池、線程池核心類、線程池工作流程、線程池分類、拒絕策略、及如何提交與關閉線程池等

       但在實際開發過程中,在線程池使用過程中可能會遇到各方面的故障,如線程池阻塞,無法提交新任務等。

       如果你想監控某一個線程池的執行狀態,線程池執行類 ThreadPoolExecutor 也給出了相關的 API, 能實時獲取線程池的當前活動線程數、正在排隊中的線程數、已經執行完成的線程數、總線程數等。

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

  下面給出一個線程池使用示例,及教你獲取線程池狀態。

  1. private static ExecutorService es = new ThreadPoolExecutor(50, 100, 0L, TimeUnit.MILLISECONDS,
  2.            new LinkedBlockingQueue<Runnable>(100000));
  3. public static void main(String[] args) throws Exception {
  4.    for (int i = 0; i < 100000; i++) {
  5.        es.execute(() -> {
  6.            System.out.print(1);
  7.            try {
  8.                Thread.sleep(1000);
  9.            } catch (InterruptedException e) {
  10.                e.printStackTrace();
  11.            }
  12.        });
  13.    }
  14.    ThreadPoolExecutor tpe = ((ThreadPoolExecutor) es);
  15.    while (true) {
  16.        System.out.println();
  17.        int queueSize = tpe.getQueue().size();
  18.        System.out.println("當前排隊線程數:" + queueSize);
  19.        int activeCount = tpe.getActiveCount();
  20.        System.out.println("當前活動線程數:" + activeCount);
  21.        long completedTaskCount = tpe.getCompletedTaskCount();
  22.        System.out.println("執行完成線程數:" + completedTaskCount);
  23.        long taskCount = tpe.getTaskCount();
  24.        System.out.println("總線程數:" + taskCount);
  25.        Thread.sleep(3000);

  26.    }

  27. }

 

  線程池提交了 100000 個任務,但同時只有 50 個線程在執行工作,我們每陋 3 秒來獲取當前線程池的運行狀態。

 

第一次程序輸出:

 

  1. 當前排隊線程數:99950

  2. 當前活動線程數:50

  3. 執行完成線程數:0

  4. 總線程數(排隊線程數 + 活動線程數 +  執行完成線程數):100000

 

第二次程序輸出:

 

  1. 當前排隊線程數:99800

  2. 當前活動線程數:50

  3. 執行完成線程數:150

  4. 總線程數(排隊線程數 + 活動線程數 +  執行完成線程數):100000

 

活動線程數和總線程數是不變的,排隊中的線程數和執行完成的線程數不斷在變化,直到所有任務執行完畢,最后輸出:

 

  1. 當前排隊線程數:0

  2. 當前活動線程數:0

  3. 執行完成線程數:100000

  4. 總線程數(排隊線程數 + 活動線程數 +  執行完成線程數):100000

 

這樣,你了解了這些 API 的使用方法,你想監控線程池的狀態就非常方便了。

 


免責聲明!

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



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