线程池提交的任务执行状态监听
依赖ThreadPoolExecutor提供的hooks
根据注释可知,有三个钩子函数可供扩展使用。
任务执行之前 - run方法执行之前
任务执行之后 - run方法执行之后
线程终止时调用 - 个人理解是销毁时被执行的
源码执行流程
可以确认run方法在beforeExecute和afterExecute两个钩子函数中间。
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("线程池执行完毕");
}
}