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

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.执行结果

eeadc3d6d3e7595b34169dae26ade1bf.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值