线程池执行状态监听

线程池提交的任务执行状态监听

依赖ThreadPoolExecutor提供的hooks

image-20240314140956954.png
image-20240314141005071.png
image-20240314141033185.png

根据注释可知,有三个钩子函数可供扩展使用。

任务执行之前 - run方法执行之前

任务执行之后 - run方法执行之后

线程终止时调用 - 个人理解是销毁时被执行的

源码执行流程

image-20240314141510801.png

可以确认run方法在beforeExecute和afterExecute两个钩子函数中间。

image-20240314141715526.png

terminated()调用的地方, 注释上的意思大概是每个工作线程终结的时候都会调用tryTerminate()方法。

使用案例

public class MyTask {

    // 使用自定义线程工厂创建线程池
    public static ThreadPoolExecutor executor = new ThreadPoolExecutor(
            4,
            8,
            60,
            TimeUnit.SECONDS,
            new LinkedBlockingDeque<>(1024)
    ) {
        @Override
        protected void beforeExecute(Thread t, Runnable r) {
            System.out.println(Thread.currentThread().getName() + "开始执行任务");
        }

        @Override
        protected void afterExecute(Runnable r, Throwable t) {

            System.out.println(Thread.currentThread().getName() + "任务执行完毕");
        }

        @Override
        protected void terminated() {
            System.out.println(Thread.currentThread().getName() + "任务被终止");
        }
    };

    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            executor.execute(() -> {
                int temp = 1;
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println(temp + "-------------");
            });
        }
        while (executor.getActiveCount() != 0) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("正在运行任务的线程数量" + executor.getActiveCount());
        }
        executor.shutdown();
        System.out.println("线程池执行完毕");
    }

}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容