乾貨 | 教你如何監控 Java 線程池運行狀態

以前寫過一篇 Java 線程池的使用介紹文章《線程池全面解析》,全面介紹了什麼是線程池、線程池核心類、線程池工做流程、線程池分類、拒絕策略、及如何提交與關閉線程池等。學習

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

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

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

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

  1. private static ExecutorService es = new ThreadPoolExecutor(50, 100, 0L, TimeUnit.MILLISECONDS,開發

  2.            new LinkedBlockingQueue<Runnable>(100000));get

  3.  

  4. public static void main(String[] args) throws Exception {工作流

  5.    for (int i = 0; i < 100000; i++) {it

  6.        es.execute(() -> {io

  7.            System.out.print(1);

  8.            try {

  9.                Thread.sleep(1000);

  10.            } catch (InterruptedException e) {

  11.                e.printStackTrace();

  12.            }

  13.        });

  14.    }

  15.  

  16.    ThreadPoolExecutor tpe = ((ThreadPoolExecutor) es);

  17.  

  18.    while (true) {

  19.        System.out.println();

  20.  

  21.        int queueSize = tpe.getQueue().size();

  22.        System.out.println("當前排隊線程數:" + queueSize);

  23.  

  24.        int activeCount = tpe.getActiveCount();

  25.        System.out.println("當前活動線程數:" + activeCount);

  26.  

  27.        long completedTaskCount = tpe.getCompletedTaskCount();

  28.        System.out.println("執行完成線程數:" + completedTaskCount);

  29.  

  30.        long taskCount = tpe.getTaskCount();

  31.        System.out.println("總線程數:" + taskCount);

  32.  

  33.        Thread.sleep(3000);

  34.    }

  35.  

  36. }

線程池提交了 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 的使用方法,你想監控線程池的狀態就很是方便了。

你們有什麼問題在下邊留言,想深刻交流學習的也能夠點擊左下方的閱讀原文連接加入 Java 技術知識星球。目前知識星球 5.1勞動節-5.4 青年節優惠活動最後6個小時啦,錯過今天再等半年……

相關文章
相關標籤/搜索