开个工厂造线程

西魏陶渊明 ... 2021-12-25 Java进阶 大约 2 分钟

作者: 西魏陶渊明 博客: https://blog.springlearn.cn/ (opens new window)

西魏陶渊明

莫笑少年江湖梦,谁不少年梦江湖

# 线程工厂

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

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

# 自定义

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

  Thread ret = new Thread(runnable);
1

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

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

public class NamedThreadFactory implements ThreadFactory {

  protected static final AtomicInteger POOL_SEQ = new AtomicInteger(1);

  protected final AtomicInteger mThreadNum = new AtomicInteger(1);

  protected final String mPrefix;

  protected final boolean mDaemon;

  protected final ThreadGroup mGroup;

  public NamedThreadFactory() {
    this("pool-" + POOL_SEQ.getAndIncrement(), false);
  }

  public NamedThreadFactory(String prefix) {
    this(prefix, false);
  }

  public NamedThreadFactory(String prefix, boolean daemon) {
    mPrefix = prefix + "-thread-";
    mDaemon = daemon;
    SecurityManager s = System.getSecurityManager();
    mGroup = (s == null) ? Thread.currentThread().getThreadGroup() : s.getThreadGroup();
  }

  @Override
  public Thread newThread(Runnable runnable) {
    //就是给线程创建了一个名字和指定了一个线程组
    String name = mPrefix + mThreadNum.getAndIncrement();
    Thread ret = new Thread(mGroup, runnable, name, 0);
    ret.setDaemon(mDaemon);
    return ret;
  }

  public ThreadGroup getThreadGroup() {
    return mGroup;
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

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


本文由西魏陶渊明版权所有。如若转载,请注明出处:西魏陶渊明
上次编辑于: 2022年6月16日 21:10
贡献者: lxchinesszz