高级并发编程系列五(自定义线程工厂)

104 阅读2分钟

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("--------------------任务处理中------------------------");
    }
​
}

2.3.执行结果

image.png