是什么原因使用Executors.defaultThreadFactory()。newThread?

时间:2015-02-10 10:10:43

标签: java multithreading concurrency executor

在我们的项目中,我遇到了以下方法:

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

我错了或第一行是

的全部模拟
Thread t = new Thread(new MyRunnable(importStartedTimestamp));

请解释第一个代码段是否有优势。

P.S。

我不想创建冗余实体。

7 个答案:

答案 0 :(得分:1)

不同之处在于defaultThreadFactory创建了有意义的名称,因此在调试或分析时,您会看到像pool-2-thread-3这样的名称,这使得它很容易理解。 看一下这个 http://javahowto.blogspot.com/2011/11/why-use-threadfactory.html

答案 1 :(得分:1)

来自Java 7 docs ( Executors#defaultThreadFactory() )

  

返回用于创建新线程的默认线程工厂。这个   factory创建Executor在其中使用的所有新线程   ThreadGroup。如果有SecurityManager,则使用该组   System.getSecurityManager(),否则调用线程的组   这个defaultThreadFactory方法。每个新线程都创建为   非守护程序线程,优先级设置为较小的   Thread.NORM_PRIORITY和线程中允许的最大优先级   组。新线程的名称可通过Thread.getName()访问   pool-N-thread-M,其中N是该工厂的序列号,M   是该工厂创建的线程的序列号。

基本上这是一个工厂界面,用于为ThreadGroup创建线程。当然,您可以手动执行此操作(如第二个代码段所示,如果您需要特殊设置,还可以使用更多行),但工厂方法旨在隐藏您可能需要的所有详细信息。

此外,它不需要直接调用new Thread(),因此您也可以使用Runnable及其任何子类。

答案 2 :(得分:1)

这是其他人没有提到过的一个:

如果您正在编写将由其他程序使用的库,并且您的库需要创建线程或线程池,那么它应该使用客户端程序提供的ThreadFactory

如果客户端程序选择不提供一个,那么在使用Executors.defaultThreadFactory()时就是这样。

为客户提供通知/控制线程创建的选项以及提供自定义线程的选项将使您的图书馆对潜在客户更具吸引力。

答案 3 :(得分:0)

此外,优先级和daemon - 属性将由工厂重置为默认值。

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

new Thread()将从父线程继承这些属性。可能就是这样。可以从具有非默认优先级的线程或从守护程序线程调用工厂代码。

答案 4 :(得分:0)

据我所知,有两点不同:

名称不同: new Thread():

  

自动生成的名称的格式为“Thread - ”+ n,其中n是整数。

DefaultFactory:

  

新线程的名称可通过pool-N-thread-M的Thread.getName()访问,其中N是此工厂的序列号,M是此工厂创建的线程的序列号。

此外,设置的优先级略有不同。 new Thread():

  

新创建的线程的优先级设置为等于创建它的线程的优先级,即当前运行的线程。

defaultFactory:

  

[...]优先级设置为Thread.NORM_PRIORITY中较小的一个,以及线程组中允许的最大优先级

答案 5 :(得分:0)

newThread(Runnable r)方法:

  1. 设置ThreadGroup
  2. 设置新线程名称
  3. 设置堆栈大小(将被忽略)
  4. 设置为守护程序(如果它是守护程序)
  5. 将优先级设置为Thread.NORM_PRIORITY;
  6. 来源

    /**
     * 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;
        }
    }
    

答案 6 :(得分:0)

你是对的。 Executors.defaultThreadFactory().newThread().start()详细。

ThreadFactory的更好用例位于ExecutorsThreadFactory被接受为参数,例如newCachedThreadPool(ThreadFactory threadFactory)。在这种情况下,您可以通过更改客户端代码来更改ThreadFactory实例参数。