13、Excutors 结合 ThreadFactory 自动给线程加上线程名

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();
                  }
              }
          }
      }
    

转载于:https://my.oschina.net/liufukin/blog/2222466

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值