高级并发编程系列六(线程池钩子函数)

184 阅读2分钟

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<Runnable> 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<Runnable> blockingQueue =
            new ArrayBlockingQueue<Runnable>(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.执行结果

image.png