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

 2023-09-07 阅读 13 评论 0

摘要:1.考考你国庆假期快要结束了,准备回到工作岗位的你,是不是已经开始撸起袖子敲代码,反正发完文章我就要准备去加班了,程序员就这样,有干劲对吧那么来吧,让我们一起分享完高级并发编程系列中,线程池小节的最后一篇:钩子

1.考考你

国庆假期快要结束了,准备回到工作岗位的你,是不是已经开始撸起袖子敲代码,反正发完文章我就要准备去加班了,程序员就这样,有干劲对吧

那么来吧,让我们一起分享完高级并发编程系列中,线程池小节的最后一篇:钩子函数。首先什么是钩子函数,如果你还不知道的话,我们先简单的解释一下:所谓钩子函数,实际上就是一个空方法, 预留空方法,给具体业务来实现 (你也可以理解为先把茅坑占着)。有时候我们在设计类的时候,为了增强扩展性,会预留一些执行的机制,便于在实际处理业务的时候进行具体扩展,那么钩子函数是其中的一种实现方式。

Java写游戏脚本钩子问题?在juc包提供的线程池工具类ThreadPoolExecutor中,给我们提供了两个钩子函数,它们分别是:

在调度任务执行前执行的钩子方法:beforeExecute

在调度任务执行完成后执行的钩子方法:afterExecute

接下来我们就看一下,这两个钩子方法的作用,以及如何使用吧。这里我们需要扩展线程池工具类,即扩展:ThreadPoolExecutor

java线程池使用实例、2.案例

2.1.扩展线程池工具类

package com.anan.edu.common.newthread.pool.senior;

import java.util.concurrent.*;

jvm钩子函数。/**

* 扩展自定义线程池,钩子函数

*

* @author ThinkPad

java钩子方法,* @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

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/17445.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息