Предположим, у меня есть следующий код, и makePool может вызываться несколькими потоками. Я использую ThreadFactoryBuilder, чтобы убедиться, что потоки имеют уникальное имя.Является ли ThreadFactory сгенерированным потоком TheadFactoryBuilder безопасным?
private final ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat(
"MyBusinessClass-%d").build();
public ExecutorService makePool() {
return Executors.newFixedThreadPool(1, threadFactory);
}
или я должен взять на себя бассейн не поточно, и должны сделать что-то вроде:
private static final AtomicLong poolCount = new AtomicLong(0L);
public ExecutorService makePool() {
private final ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat(
"MyBusinessClass- " + poolCount.incrementAndGet() + "-%d").build();
return Executors.newFixedThreadPool(1, threadFactory);
}
Я не думаю, что использую фабрику по умолчанию, если я предоставляю формат имени. – joseph
Проверьте исходный код. Я думаю, вы используете его. Единственный сценарий, в котором вы не будете использовать фабрику нитей по умолчанию, - это если вы вызвали 'setThreadFactory' на объект' ThreadFactoryBuilder'. –
Я посмотрел источник. Они используют атомный длинный счетчик и используют это на фабрике анонимных потоков, которые они возвращают, поэтому он является потокобезопасным. Добавьте эту ссылку к своему ответу: http://grepcode.com/file/repo1.maven.org/maven2/com.google.guava/guava/10.0.1/com/google/common/util/concurrent/ThreadFactoryBuilder. java # 146 – joseph