經過線程池進行任務處理,有時咱們須要知道線程池中任務的執行狀態。線程
經過ThreadPoolExecutor的相關API實時獲取線程數量,排隊任務數量,執行完成線程數量等信息。code
private static ExecutorService es = new ThreadPoolExecutor(50, 100, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>( 100000 )); public static void main(String[] args) throws Exception { for (int i = 0; i < 100000; 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); } }
好比咱們每隔3秒獲取一次執行狀態信息,總共有50個工做線程。get
第一次輸出:it
當前排隊線程數: 99950 當前活動線程數: 50 執行完成線程數: 0 總線程數(排隊線程數 + 活動線程數 + 執行完成線程數): 100000
第二次輸出:io
當前排隊線程數: 99800 當前活動線程數: 50 執行完成線程數: 150 總線程數(排隊線程數 + 活動線程數 + 執行完成線程數): 100000
說明經過API能夠獲取不斷變化的線程及線程任務數量了。線程池