0%

Executors

一个跟线程池相关的工厂方法类,主要用来生成几类“ThreadPoolExecutor”和“ScheduledThreadPoolExecutor”。

在继续介绍之前,根据阿里巴巴的《Java开发手册》,首先须知:

1
2
3
4
5
【强制】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。

说明:Executors返回的线程池对象的弊端如下:
1)FixedThreadPool和SingleThreadPool:允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。
2)CachedThreadPool:允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。

同理可推及不应该用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》

您的支持将鼓励我继续分享!