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