1、需求场景
很多时候我们都会使用线程池,而且是使用多个线程池,比如在:生产者和消费者模型中,生产者线程放到一个线程池里面,而消费者线程放到另一个线程池里面,这个时候我们可以借助ThreadFactory给这两类线程加个线程名字前缀,比如:producer_xxx和consumer_xxx,这样子在使用Java的 jstack pid | grep XXX 命令就能够很好地区分哪些线程属于生产者线程,哪些数据消费者线程
2、实现原理
1、代码示例:
-
1、Executors:
-
2、factory:
2、代码流程(其实就是第三行的时候使用了Thread构造方法)
Excutors.newFixedThreadPool() ==>
ThreadFactory.newThread(Runnable runnable) ==>
new Thread(mGroup, runnable, name, 0)
3、完整代码案例
-
1、ExcutorsUse.java
package threadfactory; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * [@Author](https://my.oschina.net/arthor) liufu * [@Company](https://my.oschina.net/u/3478402) 任子行网络技术股份有限公司 * @CreateTime 2017/9/30 16:46 */ public class ExcutorsUse { public static void main(String[] args) { ExecutorService prodPool = Executors.newFixedThreadPool(5, new ThreadFactoryTest("producer-thread-", false)); ExecutorService consuPool = Executors.newFixedThreadPool(5, new ThreadFactoryTest("consumer-thread-", false)); for (int i = 0; i < 5; i++){ prodPool.execute(new ProducerThread()); } for (int i = 0; i < 5; i++){ consuPool.execute(new ConsumerThread()); } } }
-
2、ThreadFactoryTest.java
package threadfactory; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; /** * [@Author](https://my.oschina.net/arthor) liufu * [@Company](https://my.oschina.net/u/3478402) 任子行网络技术股份有限公司 * @CreateTime 2017/9/30 16:34 */ public class ThreadFactoryTest implements ThreadFactory { // 原子变量线程id自增 private final AtomicInteger mThreadNum = new AtomicInteger(1); private String prefixName; private boolean demo; private ThreadGroup tGroup; public ThreadFactoryTest(String prefixName, boolean demo){ this.prefixName = prefixName; this.demo = demo; SecurityManager sm = System.getSecurityManager(); this.tGroup = sm == null ? Thread.currentThread().getThreadGroup() : sm.getThreadGroup(); } @Override public Thread newThread(Runnable runnable) { String threadName = prefixName + "-" + mThreadNum.getAndIncrement(); Thread trd = new Thread(tGroup, runnable, threadName); trd.setDaemon(demo); return trd; } }
-
3、ProducerThread.java
package threadfactory; /** * @Author liufu * @Company 任子行网络技术股份有限公司 * @CreateTime 2017/9/30 16:54 */ public class ProducerThread implements Runnable { @Override public void run() { while (true) { System.out.println("i am producer"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
-
4、ConsumerThread.java
package threadfactory; /** * @Author liufu * @Company 任子行网络技术股份有限公司 * @CreateTime 2017/9/30 16:55 */ public class ConsumerThread implements Runnable { @Override public void run() { while (true) { System.out.println("i am consumer"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }