一个跟线程池相关的工厂方法类,主要用来生成几类“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》