天天看點

開個工廠造線程

開個工廠造線程

作者: 西魏陶淵明 部落格: ​​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;
  }
}