但在实际开发过程中,在线程池使用过程中可能会遇到各方面的故障,如线程池阻塞,无法提交新任务等。

如果你想监控某一个线程池的执行状态,线程池执行类 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);
        }
    }


}