如果你想监控某一个线程池的执行状态,线程池执行类 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
活动线程数和总线程数是不变的,排队中的线程数和执行完成的线程数不断在变化,直到所有任务执行完毕,最后输出:
-
当前排队线程数:0
-
当前活动线程数:0
-
执行完成线程数:100000
-
总线程数(排队线程数 + 活动线程数 + 执行完成线程数):100000
这样,你了解了这些 API 的使用方法,你想监控线程池的状态就非常方便了。