获取线程池中任务执行数量
- 通过线程池进行任务处理,有时我们需要知道线程池中任务的执行状态。
- 通过ThreadPoolExecutor的相关API实时获取线程数量,排队任务数量,执行完成线程数量等信息。
实例
-
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个工作线程。
-
第一次输出:
-
当前排队线程数: 99950 当前活动线程数: 50 执行完成线程数: 0 总线程数(排队线程数 + 活动线程数 + 执行完成线程数): 100000
-
第二次输出:
-
当前排队线程数: 99800 当前活动线程数: 50 执行完成线程数: 150 总线程数(排队线程数 + 活动线程数 + 执行完成线程数): 100000
-
说明通过API可以获取不断变化的线程及线程任务数量了。