В чем причина использовать Executors.defaultThreadFactory (). NewThread?

1

В нашем проекте я столкнулся с следующим методом:

Thread t = Executors.defaultThreadFactory().newThread(new MyRunnable(importStartedTimestamp));
t.setName("my thread");
t.start();

Я ошибаюсь, или первая строка является полным аналогом

Thread t = new Thread(new MyRunnable(importStartedTimestamp));

Пожалуйста, объясните, есть ли у первого фрагмента кода преимущества.

PS

Я не люблю создавать избыточные объекты.

Теги:
multithreading
concurrency
executor

7 ответов

0
Лучший ответ

Ты прав. Executors.defaultThreadFactory().newThread().start() является подробным.

Лучший вариант использования ThreadFactory - в Executors. ThreadFactory принимается как аргумент, например newCachedThreadPool(ThreadFactory threadFactory). В этом случае вы можете изменить ThreadFactory экземпляра ThreadFactory с изменением кода клиента.

1

Здесь тот, о котором никто еще не упоминал:

Если вы пишете библиотеку, которая будет использоваться другими программами, и если вашей библиотеке необходимо создать потоки или пулы потоков, тогда она должна использовать ThreadFactory, поставляемую клиентской программой.

Если клиентская программа выбирает не предоставлять ее, то при использовании Executors.defaultThreadFactory().

Предоставление клиенту опции для уведомления/создания создания потока и возможности предоставления пользовательских потоков сделает вашу библиотеку более привлекательной для потенциальных клиентов.

1

Из документов Java 7 (Executors # defaultThreadFactory()):

Возвращает фабрику потоков по умолчанию, используемую для создания новых потоков. Эта фабрика создает все новые потоки, используемые Исполнителем в той же ThreadGroup. Если есть SecurityManager, он использует группу System.getSecurityManager(), иначе группу потока вызывает этот метод defaultThreadFactory. Каждый новый поток создается как поток не-демона с приоритетом, установленным на меньшее из Thread.NORM_PRIORITY и максимальным приоритетом, разрешенным в группе потоков. Новые потоки имеют имена, доступные через Thread.getName() для пула-N-thread-M, где N - порядковый номер этой фабрики, а M - порядковый номер потока, созданного этой фабрикой.

В основном это фабричный интерфейс для создания потоков для ThreadGroup. Конечно, вы можете сделать это вручную (как показывает второй фрагмент кода, и еще несколько строк, если вам нужны специальные настройки, например.), Но фабричный метод был разработан, чтобы скрыть все детали, которые могут вам понадобиться.

Также он устраняет необходимость прямого вызова new Thread() поэтому вы также можете использовать Runnable и любой из своих подклассов.

1

Разница в том, что defaultThreadFactory создает значимые имена, поэтому во время отладки или профилирования вы видите имена типа pool-2-thread-3, что позволяет легко следовать. Проверьте это http://javahowto.blogspot.com/2011/11/why-use-threadfactory.html

0

Метод newThread (Runnable r) делает следующее:

  1. Настройка ThreadGroup
  2. Настроить новое имя потока
  3. Размер установочного стека (будет проигнорирован)
  4. Установите в качестве демона (если он демон)
  5. Задайте приоритет Thread.NORM_PRIORITY;

Источник

/**
 * 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 s = System.getSecurityManager();
        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;
    }
}
0

Насколько я могу судить по двум отличиям:

Имена разные: new Thread():

Автоматически сгенерированные имена имеют форму "Thread-" +n, где n - целое число.

DefaultFactory:

Новые потоки имеют имена, доступные через Thread.getName() пула-N- Thread- M, где N - порядковый номер этой фабрики, а M - порядковый номер потока, созданного этой фабрикой.

Кроме того, установленный приоритет немного отличается. новый поток():

Приоритет вновь созданного потока устанавливается равным приоритету потока, создающего его, то есть текущий поток.

DefaultFactory:

[...] с приоритетом, установленным на меньшее из Thread.NORM_PRIORITY и максимальным приоритетом, разрешенным в группе потоков

0

Кроме того, приоритет и daemon -property сбрасываются на заводские по умолчанию.

if (t.isDaemon())
    t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
    t.setPriority(Thread.NORM_PRIORITY);

new Thread() наследует эти свойства от родительского потока. Наверное, это случай. Заводский код может вызываться из потока с приоритетом не по умолчанию или потоком демона.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню