一个跟线程池相关的工厂方法类,主要用来生成几类“ThreadPoolExecutor”和“ScheduledThreadPoolExecutor”。
在继续介绍之前,根据阿里巴巴的《Java开发手册》,首先须知:
| 1 | 【强制】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 | 
同理可推及不应该用Executors去创建ScheduledThreadPoolExecutor,而是显式创建。
一、生成ThreadPoolExecutor
常见的有3个方法,这里不列出增加一个“ThreadFactory threadFactory”的重载方法:
- public static ExecutorService newCachedThreadPool():方法主体为- new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()),根据以上构造参数构造的ThreadPoolExecutor实例语义可见[1],“SynchronousQueue”的语义可见[3]
- public static ExecutorService newFixedThreadPool(int nThreads):方法主体为- new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()),根据以上构造参数构造的ThreadPoolExecutor实例语义可见[1],“LinkedBlockingQueue”的语义可见[3]
- public static ExecutorService newSingleThreadExecutor():方法主体为- new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())),根据以上构造参数构造的ThreadPoolExecutor实例语义可见[1],“LinkedBlockingQueue”的语义可见[3],查看FinalizableDelegatedExecutorService类的定义,它采用了“代理设计模式”,内部核心对象是上面构造的ThreadPoolExecutor实例,向外只暴露ExecutorService接口定义的方法。与之对应的是上面两个方法返回的实际对象是ThreadPoolExecutor,向下转型成ThreadPoolExecutor实例后除了可调用ExecutorService接口中定义的方法,还可调用ThreadPoolExecutor类中新增的方法
二、生成ScheduledThreadPoolExecutor
常见的有2个方法,这里不列出增加一个“ThreadFactory threadFactory”的重载方法:
- public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize):方法主体为- new ScheduledThreadPoolExecutor(corePoolSize),根据以上构造参数构造的ScheduledThreadPoolExecutor实例语义可见[2]
- public static ScheduledExecutorService newSingleThreadScheduledExecutor():方法主体为- new DelegatedScheduledExecutorService(new ScheduledThreadPoolExecutor(1)),根据以上构造参数构造的ScheduledThreadPoolExecutor实例语义可见[2],查看DelegatedScheduledExecutorService类的定义,它采用了“代理设计模式”,内部核心对象是上面构造的ScheduledThreadPoolExecutor实例,向外只暴露ScheduledExecutorService接口定义的方法。与之对应的是上面一个方法返回的实际对象是ScheduledThreadPoolExecutor,向下转型成ScheduledThreadPoolExecutor实例后除了可调用ScheduledExecutorService接口中定义的方法,还可调用ScheduledThreadPoolExecutor类中新增的方法
参考文献
[1]《ThreadPoolExecutor》
[2]《ScheduledThreadPoolExecutor》
[3]《并发Queue》
