Java并发包学习一 ThreadFactory介绍

Posted 积淀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java并发包学习一 ThreadFactory介绍相关的知识,希望对你有一定的参考价值。

 

  ThreadFactory翻译过来是线程工厂,顾名思义,就是用来创建线程的,它用到了工厂模式的思想。它通常和线程池一起使用,主要用来控制创建新线程时的一些行为,比如设置线程的优先级,名字等等。它是一个接口,接口中只有一个方法:

/*
 *
 *
 *
 *
 *
 * Written by Doug Lea with assistance from members of JCP JSR-166
 * Expert Group and released to the public domain, as explained at
 * http://creativecommons.org/publicdomain/zero/1.0/
 */

package java.util.concurrent;

/**
 * An object that creates new threads on demand.  Using thread factories
 * removes hardwiring of calls to {@link Thread#Thread(Runnable) new Thread},
 * enabling applications to use special thread subclasses, priorities, etc.
 *
 * <p>
 * The simplest implementation of this interface is just:
 * <pre>
 * class SimpleThreadFactory implements ThreadFactory {
 *   public Thread newThread(Runnable r) {
 *     return new Thread(r);
 *   }
 * }
 * </pre>
 *
 * The {@link Executors#defaultThreadFactory} method provides a more
 * useful simple implementation, that sets the created thread context
 * to known values before returning it.
 * @since 1.5
 * @author Doug Lea
 */
public interface ThreadFactory {

    /**
     * Constructs a new {@code Thread}.  Implementations may also initialize
     * priority, name, daemon status, {@code ThreadGroup}, etc.
     *
     * @param r a runnable to be executed by new thread instance
     * @return constructed thread, or {@code null} if the request to
     *         create a thread is rejected
     */
    Thread newThread(Runnable r);
}

 

下面定义MyThreadFactoryTest1类实现ThreadFactory接口的newThread方法:创建线程时候,为线程设置名字,代码如下:

 

package concurrentMy.ThreadFactory;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 
 * (类型功能说明描述)
 *
 * <p>
 * 修改历史:                                            <br>  
 * 修改日期            修改人员       版本             修改内容<br>  
 * -------------------------------------------------<br>  
 * 2016年3月15日 下午6:31:57   user     1.0        初始化创建<br>
 * </p> 
 *
 * @author        Peng.Li 
 * @version        1.0  
 * @since        JDK1.7
 */
public class MyThreadFactoryTest1 implements ThreadFactory {

    private final AtomicInteger count = new AtomicInteger(0);

    // private final String namePrefix = "jmsgPool-" + count.incrementAndGet() + "-" + "PersistenceWrite" + "-thread-";

    @Override
    public Thread newThread(Runnable r) {
        Thread t = new Thread(r);
        t.setName("jmsgPool-" + count.incrementAndGet() + "-" + "PersistenceWrite" + "-thread");
        System.out.println("Create new thread, thread name: " + t.getName());
        return t;
    }

    /**
     * 
     * (测试) 
     *
     * @param args
     */

    public static void main(String[] args) {
        ExecutorService service = Executors.newFixedThreadPool(5, new MyThreadFactoryTest1());

        for (int i = 0; i <= 5; i++) {
            service.submit(new Runnable() {

                @Override
                public void run() {
                    System.out.println("Start execute...");
                }
            });
        }

    }
}

 

Create new thread, thread name: jmsgPool-1-PersistenceWrite-thread
Create new thread, thread name: jmsgPool-2-PersistenceWrite-thread
Start execute...
Create new thread, thread name: jmsgPool-3-PersistenceWrite-thread
Start execute...
Create new thread, thread name: jmsgPool-4-PersistenceWrite-thread
Start execute...
Create new thread, thread name: jmsgPool-5-PersistenceWrite-thread
Start execute...
Start execute...
Start execute...

 

JDK中默认的ThreadFactory

在JDK的Executors类中有一个DefaultThreadFactory类,它实现了ThreadFactory,它是JDK中默认的线程工厂类,从源码可以看到这个线程工厂类为线程池中新创建的线程设置的名字为:

 

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

 

以上是关于Java并发包学习一 ThreadFactory介绍的主要内容,如果未能解决你的问题,请参考以下文章

JAVA高并发程序设计学习-JDK并发包:同步控制一

Java并发包下锁学习第二篇Java并发基础框架-队列同步器介绍

Java学习笔记—多线程(java.util.concurrent并发包概括,转载)

java 并发包学习

020 ThreadFactoryBuilder

[Java并发包学习七]解密ThreadLocal