線程池3rd卷:龍臥淺灘等海潮

笑談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;
        }
    }

到了這裏,你突然有點懷疑自己當初的選擇(做一隻程序猿)…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章