笑談ThreadFactory
全世界讓一個人沉默並不比一個人讓全世界沉默更具有正當性。——約翰•密爾
眼看你的飯店生意越做越大,又出現了一個頭疼的問題——廚師管理問題。福禍相依,你發現有些廚師培訓學校的校長開始主動找你喝茶,大家都心知肚明,這是“醉翁之意不在酒”,校長是來推銷自己的學生,進而提高學校的就業率。你表面上裝出一副爲難的樣子,心中已有主意。
ThreadFactory就是我們抽象的廚師培訓學校,對於廚師的等級,姓名,狀態**(Thread的 priority, name ,daemon status…**)等工作全部可以集中在這裏處理。
public interface ThreadFactory {
/**
* Constructs a new {@code Thread}. Implementations may also initialize
* priority, name, daemon status, {@code ThreadGroup}, etc.
* 創建新線程,可以在這裏設置線程的權限,名稱,守護狀態的...
*/
Thread newThread(Runnable r);
}
爲了讓飯店生意不出現什麼意外,還需要指定一個默認廚師培訓學校(DefaultThreadFactory)。
/**
* The default thread factory
* 默認的“廚師培訓學校”
*/
static class DefaultThreadFactory 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;
DefaultThreadFactory() {
/**
* 這裏的SecurityManager就不展開討論,有需要的下方評論,看情況出一篇文章
* ThreadGroup 顧名思義,代表一個線程集合,是樹狀結構。
*/
SecurityManager s = System.getSecurityManager();
// getThreadGroup() 創建實例化任何一個線程都會被調用。
group = (s != null) ? s.getThreadGroup() :
Thread.currentThread().getThreadGroup();
namePrefix = "pool-" +
poolNumber.getAndIncrement() +
"-thread-";
}
public Thread newThread(Runnable r) {
Thread t = new Thread(group, r,
namePrefix + threadNumber.getAndIncrement(),
0);
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
}
到了這裏,你突然有點懷疑自己當初的選擇(做一隻程序猿)…