【Thread】线程工厂-ThreadFactory

ThreadFactory---线程工厂

在apollo源码中有这么一段代码

 

ExecutorService  m_longPollingService = Executors.newSingleThreadExecutor(ApolloThreadFactory.create("RemoteConfigLongPollService", true));
m_longPollingService.submit(new Runnable() {
  @Override
  public void run() {
    if (longPollingInitialDelayInMills > 0) {
      try {
        logger.debug("Long polling will start in {} ms.", longPollingInitialDelayInMills);
        TimeUnit.MILLISECONDS.sleep(longPollingInitialDelayInMills);
      } catch (InterruptedException e) {
   
      }
    }
    doLongPollingRefresh(appId, cluster, dataCenter);
  }
});

 


ApolloThreadFactory类继承了ThreadFactory,如下:
public class ApolloThreadFactory implements ThreadFactory 

了解了下ThreadFacotry的用法,主要有两个用处
1:异常处理,线程计数
2:设置线程池属性

ThreadFactory接口只有一个方法调用 newThread()。它接收一个 Runnable对象作为参数,并返回一个 Thread对象。当你实现一个 ThreadFactory接口,您必须实现该接口并覆盖此方法。
public class ApolloThreadFactory implements ThreadFactory 
public Thread newThread(Runnable runnable) {
  Thread thread = new Thread(threadGroup, runnable,//
      threadGroup.getName() + "-" + namePrefix + "-" + threadNumber.getAndIncrement());
  thread.setDaemon(daemon);
  if (thread.getPriority() != Thread.NORM_PRIORITY) {
    thread.setPriority(Thread.NORM_PRIORITY);
  }
  return thread;
}

 


执行者框架(Executor framework)是一种机制,它允许你将线程的创建与执行分离。它是基于Executor、ExecutorService接口和实现这两个接口的ThreadPoolExecutor类。它有一个内部的线程池和提供一些方法,这些方法允许你提交两种任务给线程池执行。这两种任务是:

  • 实现Runnable接口的类,用来实现没有返回结果的任务
  • 实现Callable接口的类,用来实现有返回结果的任务

在执行者框架(Executor framework)的内部,它提供一个ThreadFactory接口来创建线程,这是用来产生新的线程。在这个指南中,你将学习如何实现你自己的线程类,用一个工厂来创建这个类的线程,及如何在执行者中使用这个工厂,所以这个执行者将执行你的线程。

 

执行者框架步骤:

按以下步骤来实现的这个例子:

1.将实现ThreadFactory接口生成自定义线程的指南中实现的MyThread、MyThreadFactory和MyTask类复制到这个项目中,所以你将在这个例子中继续使用它们。

2.实现这个例子的主类,通过创建Main类,并实现mian()方法。

3.创建一个新的MyThreadFactory对象,名为threadFactory。

    MyThreadFactory threadFactory=new MyThreadFactory("MyThreadFactory");

4.使用Executors类的newCachedThreadPool()方法,创建一个新的Executor对象。传入前面创建的工厂对象作为参数。这个新的Executor对象将使用这个工厂创建必需的线程,所以它将执行MyThread线程。

          ExecutorService executor=Executors.newCachedThreadPool(threadFactory);

 

5.创建一个新的Task对象,并使用submit()方法将它提交给执行者。

    MyTask task=new MyTask()

          executor.submit(task);

6.使用shutdown()方法关闭这个执行者。

          executor.shutdown();

 

7.使用awaitTermination()方法,等待执行者的结束。

         executor.awaitTermination(1, TimeUnit.DAYS);

 

8.写入一条信息表明程序的结束。

         System.out.printf("Main: End of the program.\n");

 





 
posted @ 2017-09-04 19:52  码农阿当lodor  阅读(778)  评论(0编辑  收藏  举报