比如我有一个线程池,里面有1w个任务,但是单次只执行5个任务,我想实时获取当前积压的数据,案例如下
ExecutorService executorService = new ThreadPoolExecutor(9, 9,
0, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(), new BasicThreadFactory.Builder().namingPattern("attach-transform-job-%d")
.daemon(true).build());
int i=0;
while (i++<10000){
executorService.execute(()->{
//模拟执行任务
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("执行结束");
});
}
方法一,调用线程池的getTaskCount()方法 可以获取一个近似的值,但是这个方法会加主锁,频繁调用影响性能。
方法二:继承ThreadPoolExecutor 重写afterExecute(Runnable r, Throwable t) 这个方法,在这个方法里实现计数功能,当执行完任务或执行任务异常都会调这个方法,所以可以试试计数。
总数减去当前执行数不就行了吗。