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