1.引子
在企业项目中,你现在应该已经知道了如何创建和使用线程池。那么你知道吗?在实际使用线程池当中,我们还需要注意一些小细节。比如说在我们使用线程池的时候,会通过默认的线程工厂DefaultThreadFactory来创建线程池中的线程,大多数时候,这并没有什么问题。
但是有时候,可能你会有这样的需求,能不能给特定的任务线程,取一个特定的名称,比如叫线程张三、或者线程李四。让每个特定任务的线程都有一个与任务相联系的名称,这在跟踪任务执行情况,或者在排查问题的时候,会非常的有用。
那么在这一篇中,让我们一起分享:如何自定义自己的线程工厂吧
2.案例
2.1.自定义线程工厂类
package com.anan.edu.common.newthread.pool.senior;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 自定义线程工厂
*
* @author ThinkPad
* @version 1.0
* @date 2020/10/4 11:47
*/
public class MyThreadFactory implements ThreadFactory{
/**
* 线程池编号,与线程组
*/
private static final AtomicInteger poolNumber = new AtomicInteger(1);
private final ThreadGroup group;
/**
* 线程编号,与线程名称前缀
*/
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;
/**
* 无参数构造方法
*/
MyThreadFactory(){
SecurityManager s = System.getSecurityManager();
group = (s != null) ? s.getThreadGroup() :
Thread.currentThread().getThreadGroup();
namePrefix = "myPool-" +
poolNumber.getAndIncrement() +
"-MyThread-";
}
@Override
public Thread newThread(Runnable r) {
// 实例化线程对象
Thread t = new Thread(group, r,
namePrefix + threadNumber.getAndIncrement(),
0);
return t;
}
}
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 threadPoolExecutor = new ThreadPoolExecutor(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("--------------------任务处理中------------------------");
}
}