2016-11-25 15 views
1

Предположим, у меня есть следующий код, и 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); 
} 

ответ

1

Моя чтение source code (Гуава 10.0.1) является то, что он является поточно при условии, что завод по производству резьбы защищен резьбой. В вашем коде фабрика поддерживающих потоков будет экземпляром Executors.DefaultThreadFactory, который является потокобезопасным.

Обратите внимание, что ни один из этого не указано ... насколько я могу видеть .. Однако, способ, которым эти классы кодируются говорит мне, что они являются поточно-дизайн. Изменчивые компоненты соответствующих объектов состоят из счетчиков, реализованных как атомистика, а создание/запуск потоков имеет значение - до.

+0

Я не думаю, что использую фабрику по умолчанию, если я предоставляю формат имени. – joseph

+1

Проверьте исходный код. Я думаю, вы используете его. Единственный сценарий, в котором вы не будете использовать фабрику нитей по умолчанию, - это если вы вызвали 'setThreadFactory' на объект' ThreadFactoryBuilder'. –

+0

Я посмотрел источник. Они используют атомный длинный счетчик и используют это на фабрике анонимных потоков, которые они возвращают, поэтому он является потокобезопасным. Добавьте эту ссылку к своему ответу: http://grepcode.com/file/repo1.maven.org/maven2/com.google.guava/guava/10.0.1/com/google/common/util/concurrent/ThreadFactoryBuilder. java # 146 – joseph