获取线程池中任务执行数量
- 通过线程池进行任务处理,有时我们需要知道线程池中任务的执行状态。
- 通过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可以获取不断变化的线程及线程任务数量了。