但在实际开发过程中,在线程池使用过程中可能会遇到各方面的故障,如线程池阻塞,无法提交新任务等。
如果你想监控某一个线程池的执行状态,线程池执行类 ThreadPoolExecutor
也给出了相关的 API, 能实时获取线程池的当前活动线程数、正在排队中的线程数、已经执行完成的线程数、总线程数等。
Java线程池及Future、Callable获得线程返回结果【Java线程池系列2】
Java多线程编程中,经常使用的Thread的Runnable()虽然被经常使用,但其有一个弊端,就是因为无法直接获取该线程的返回值,因为Runnable内的run方法,被定义为void类型,如果开发者需要在线程中处理耗时操作并获得结果,那么必须自己实现一套结果获取的途径,这其实增加了开发者的代码工作量,也可能会因为对线程的不熟悉,造成不必要的代码错误(线程的同步等等问题)。
可是,绝大多情况跑完Java的线程run后,并不是让它啥都不干的void,而是希望获得运行结果。因此,从Java 5开始,Java在语言层级增加了支持线程返回结果的Future、Callable,用以支持和解决上述问题,完事线程编程模型。
import java.util.concurrent.*;
/**
* @author
* @Date 2021/12/1 15:22
* @Desc 监控线程池的状态
* @Param
* @Return
*/
public class ExecutorService2 {
private static java.util.concurrent.ExecutorService executor = new ThreadPoolExecutor(4, 6, 1, TimeUnit.MINUTES,
new LinkedBlockingQueue<>(100000), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
public static void main(String[] args) throws Exception {
for (int i = 0; i < 100000; i++) {
executor.execute(() -> {
System.out.print(1);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
ThreadPoolExecutor tpe = ((ThreadPoolExecutor) executor);
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);
}
}
}