笑谈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;
}
}
到了这里,你突然有点怀疑自己当初的选择(做一只程序猿)…