项目概况

开个工厂造线程

2026-01-291 min read后端技术
Java进阶

作者: 西魏陶渊明 博客: https://blog.springlearn.cn/

!!! tip 西魏陶渊明 莫笑少年江湖梦,谁不少年梦江湖 !!!

线程工厂

线程是Java里面很重要的一个概念,具体体现就是Thread这个类。我们平时最常用的创建线程就是在用Executors来创建线程池。在前面的章节 也可以看到,创建线程池时候有一个入参就是线程工厂,ThreadFactory这个类。那么这个类具体有什么用呢? 其实就是为了统一在创建线程时设置一些参数, 如是否守护线程。线程一些特性等,如优先级,名称。

java
1 /** 2 * @param threadFactory 线程工厂 3 */ 4 public ThreadPoolExecutor(int corePoolSize, 5 int maximumPoolSize, 6 long keepAliveTime, 7 TimeUnit unit, 8 BlockingQueue<Runnable> workQueue, 9 ThreadFactory threadFactory) { 10 this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, 11 threadFactory, defaultHandler); 12 }

自定义

所谓线程工厂其实就是创建线程使用的。正常情况下我们创建线程是下面这样的。

java
1 Thread ret = new Thread(runnable);

但是线程的构造其实并不是只有一个,它有一个线程组的概念,另外也可以给每个线程去设置一个名字。这样的目的是可以通过名字就能辨认是什么线程在执行。

那么我们就看下这里面怎么实现的,其实非常简单。

java
1public class NamedThreadFactory implements ThreadFactory { 2 3 protected static final AtomicInteger POOL_SEQ = new AtomicInteger(1); 4 5 protected final AtomicInteger mThreadNum = new AtomicInteger(1); 6 7 protected final String mPrefix; 8 9 protected final boolean mDaemon; 10 11 protected final ThreadGroup mGroup; 12 13 public NamedThreadFactory() { 14 this("pool-" + POOL_SEQ.getAndIncrement(), false); 15 } 16 17 public NamedThreadFactory(String prefix) { 18 this(prefix, false); 19 } 20 21 public NamedThreadFactory(String prefix, boolean daemon) { 22 mPrefix = prefix + "-thread-"; 23 mDaemon = daemon; 24 SecurityManager s = System.getSecurityManager(); 25 mGroup = (s == null) ? Thread.currentThread().getThreadGroup() : s.getThreadGroup(); 26 } 27 28 @Override 29 public Thread newThread(Runnable runnable) { 30 //就是给线程创建了一个名字和指定了一个线程组 31 String name = mPrefix + mThreadNum.getAndIncrement(); 32 Thread ret = new Thread(mGroup, runnable, name, 0); 33 ret.setDaemon(mDaemon); 34 return ret; 35 } 36 37 public ThreadGroup getThreadGroup() { 38 return mGroup; 39 } 40}

如此而已,线程工厂就是这样。