1.考考你
国庆假期快要结束了,准备回到工作岗位的你,是不是已经开始撸起袖子敲代码,反正发完文章我就要准备去加班了,程序员就这样,有干劲对吧
那么来吧,让我们一起分享完高级并发编程系列中,线程池小节的最后一篇:钩子函数。首先什么是钩子函数,如果你还不知道的话,我们先简单的解释一下:所谓钩子函数,实际上就是一个空方法, 预留空方法,给具体业务来实现 (你也可以理解为先把茅坑占着)。有时候我们在设计类的时候,为了增强扩展性,会预留一些执行的机制,便于在实际处理业务的时候进行具体扩展,那么钩子函数是其中的一种实现方式。
在juc包提供的线程池工具类ThreadPoolExecutor中,给我们提供了两个钩子函数,它们分别是:
在调度任务执行前执行的钩子方法:beforeExecute
在调度任务执行完成后执行的钩子方法:afterExecute
接下来我们就看一下,这两个钩子方法的作用,以及如何使用吧。这里我们需要扩展线程池工具类,即扩展:ThreadPoolExecutor
2.案例
2.1.扩展线程池工具类
package com.anan.edu.common.newthread.pool.senior;
import java.util.concurrent.*;
/**
* 扩展自定义线程池,钩子函数
*
* @author ThinkPad
* @version 1.0
* @date 2020/10/4 12:02
*/
public class MyThreadPoolExecutor extends ThreadPoolExecutor{
/**
* 构造方法
* @param corePoolSize
* @param maximumPoolSize
* @param keepAliveTime
* @param unit
* @param workQueue
* @param threadFactory
*/
public MyThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory) {
// 通过父类构造方法实例化
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
threadFactory);
}
/**
* 钩子方法,执行任务前执行
* @param t
* @param r
*/
@Override
protected void beforeExecute(Thread t, Runnable r) {
System.out.println("当前线程:"+t.getName()+ "正准备执行任务......start");
}
/**
* 钩子方法,执行任务后执行
* @param r
* @param t
*/
@Override
protected void afterExecute(Runnable r, Throwable t) {
System.out.println("当前线程:"+Thread.currentThread().getName()+ "执行任务结束......end");
}
}
2.2.使用扩展线程池
package com.anan.edu.common.newthread.pool.senior;
import java.util.concurrent.*;
/**
* 高级线程池案例:
* 1.自定义线程工厂
* 2.扩展juc线程池钩子函数
*
* @author ThinkPad
* @version 1.0
* @date 2020/10/4 11:55
*/
public class SeniorThreadPoolDemo {
/**
* 定义线程池参数
*/
public static final int corePoolSize = 3;// 核心线程数量
public static final int maximumPoolSize = 5;// 最大线程数量
public static final long keepAliveTime = 60;// 空闲线程活跃时间
public static final TimeUnit timeUnit = TimeUnit.MILLISECONDS;// 时间单位
public static final BlockingQueue blockingQueue =
new ArrayBlockingQueue(100);// 任务缓冲队列
public static final ThreadFactory threadFactory = new MyThreadFactory();// 线程工厂
public static void main(String[] args) {
// 1.实例化扩展的线程池(扩展钩子函数)
ThreadPoolExecutor threadPoolExecutor = new MyThreadPoolExecutor(corePoolSize,
maximumPoolSize,
keepAliveTime,
timeUnit,
blockingQueue,
threadFactory);
// 2.提交任务,并执行
threadPoolExecutor.execute(new Task());
// 3.释放线程池资源
threadPoolExecutor.shutdown();
}
}
/**
* 任务
*/
class Task implements Runnable{
@Override
public void run() {
System.out.println("当前正在处理任务线程:" + Thread.currentThread().getName());
System.out.println("--------------------任务处理中------------------------");
}
}
2.3.执行结果