private static ThreadFactory doBuild(ThreadFactoryBuilder builder) {
final String nameFormat = builder.nameFormat;
final Boolean daemon = builder.daemon;
final Integer priority = builder.priority;
final UncaughtExceptionHandler uncaughtExceptionHandler = builder.uncaughtExceptionHandler;
final ThreadFactory backingThreadFactory =
(builder.backingThreadFactory != null)
? builder.backingThreadFactory
: Executors.defaultThreadFactory();
final AtomicLong count = (nameFormat != null) ? new AtomicLong(0) : null;
return new ThreadFactory() {
@Override
public Thread newThread(Runnable runnable) {
Thread thread = backingThreadFactory.newThread(runnable);
if (nameFormat != null) {
thread.setName(format(nameFormat, count.getAndIncrement()));
}
if (daemon != null) {
thread.setDaemon(daemon);
}
if (priority != null) {
thread.setPriority(priority);
}
if (uncaughtExceptionHandler != null) {
thread.setUncaughtExceptionHandler(uncaughtExceptionHandler);
}
return thread;
}
};
}
Недавно я начал изучать ThreadFactory
, который используется ThreadPoolExecutor
для создания новых потоков в пуле потоков. Для удобства отладки и мониторинга мы не хотим, чтобы потоки, созданные пулом потоков, имели значение по умолчанию 0,1,2,3, а должны иметь осмысленное имя.
Одним из способов достижения этой цели является для реализации настраиваемого ThreadLoad
, который может устанавливать имя потока при создании потока. Guava имеет удобный класс конструктора для настройки ThreadFactory
, и я хочу sh учиться на нем.
Нетрудно понять большую часть этого класса, но я вполне смущает переменная count
в методе doBuild
.
Я также перешел к исходному коду ThreadPoolExecutor#Worker
, где фактически вызывается newThread()
из ThreadFactory
.
Worker(Runnable firstTask) {
setState(-1); // inhibit interrupts until runWorker
this.firstTask = firstTask;
this.thread = getThreadFactory().newThread(this);
}
Но я все еще не понимаю, зачем нам здесь нужна переменная atomi c.
Конечно, я могу предположить, что потоки в пуле потоков могут быть созданы многопоточным способом, чтобы гарантировать идентификатор потоков не дублируется, нам нужно, чтобы генератор идентификаторов был переменной atomi c, но у меня пока нет прямых доказательств этого предположения.
Может ли кто-нибудь пролить свет на это?