所谓钩子函数,通俗地将也就是父类定义的一些空实现的方法,子类通过实现这些方法,在程序运行的声明周期中的某个阶段来回调这些方法,实现我们自定义的功能。
java的线程池ThreadPoolExecutor为我们提供了三个钩子函数:
- beforeExecute:在执行任务之前回调
- afterExecute:在任务执行完后回调
- terminated:在线程池中的所有任务执行完毕后回调
作用
我们可以使用钩子方法在线程池执行任务的前后做一些事情,比如:日志记录,数据统计等等。
使用beforeExecute实现暂停线程池的功能
public class PauseableThreadPool extends ThreadPoolExecutor {
private Lock lock = new ReentrantLock();
private Condition unpaused = lock.newCondition();
private boolean isPaused;
public PauseableThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
}
public PauseableThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) {