• 【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. ");

     





     
  • 相关阅读:
    201871010132张潇潇《面向对象程序设计(java)》第六七周学习总结
    201871010132张潇潇《面向对象程序设计(java)》第七周总结
    201871010132张潇潇《面向对象程序设计(java)》第十周总结
    201871010132张潇潇《面向对象程序设计(java)》第四周学习总结
    201871010132张潇潇《面向对象程序设计(java)》第十三周学习总结
    201871010132张潇潇《面向对象程序设计(java)》第一周学习总结
    201871010132张潇潇《面向对象程序设计(java)》第八周总结
    201871010132——张潇潇《面向对象程序设计JAVA》第二周学习总结
    201871010132张潇潇《面向对象程序设计(Java)》第十一周学习总结
    201871010132张潇潇《面向对象程序设计(java)》第十二周学习总结
  • 原文地址:https://www.cnblogs.com/lodor/p/7475259.html
Copyright © 2020-2023  润新知