Executors源码解读——创建ExecutorService线程池
- 〇、[源码版本] jdk 1.8
- 一、线程池概述
- 二、线程池创建
- 三、Executors源码解读
- newFixedThreadPool()
- newWorkStealingPool()
- newSingleThreadExecutor()
- newCachedThreadPool()
- newSingleThreadScheduledExecutor()
〇、[源码版本] jdk 1.8
一、线程池概述
1)线程的创建需要操作线程资源、栈空间等,大量且频繁的创建与销毁需要消耗大量时间。
2)使用线程池处理,就可以复用一组线程,把一小组任务交给线程池分发处理。
3)线程池内维护了若干数量的线程:
a.没有任务时候,这些线程处于等待状态
b.有新任务,就分配一个空闲的线程执行
c.若所有线程处于忙碌状态,新任务要么放入队列等待,要么增加一个新线程进行处理。
二、线程池创建
ExecutorService
是接口,它常用的创建方式可以通过Executors
的方法来创建。
三、Executors源码解读
为这些对象提供工厂和实用方法:在concurrent
包中定义的Executor
、ExecutorService
、ScheduledExecutorService
、ThreadFactory
和Callable
类。
提供的方法返回结果类型有:
a.常规配置的ExecutorService
b.常规配置的ScheduledExecutorService
c.禁止修改配置的封装后的ExecutorService
(d.将新创建的线程设置为已知状态的ThreadFactory
)
(e.在其他类似封闭(closure-like)的形式以外的Callable
)
本文主要讨论前三种。
newFixedThreadPool()
public static ExecutorService newFixedThreadPool(int nThreads)
Executors
创建一个线程池,该线程池复用固定数量的线程,线程操作在共享的无界队列。在任何时候,最多nThreads
个线程将正在运行处理任务。
如果在所有线程都处于忙碌状态时,提交了其他任务,它们将在队列中等待,直到有线程可用。
如果任何线程因执行期间的失败而终止,且在关闭之前,如果后续任务需要执行,一个新线程将取而代之。
池中的线程会一直存在,直到明确调用ExecutorService
的shutdown
方法。
a.参数:
nThreads
池中的线程数
b.返回:
ExecutorService
新创建的线程池
c.异常
throws IllegalArgumentException
如果nThreads
个数小于等于0时
newWorkStealingPool()
public static ExecutorService newWorkStealingPool(int parallelism)
创建一个线程池,它维持足够的线程来支持给定的并行度级别parallelism
,并且可能会使用多个队列来减少争用。
并行度级别对应于最大的活跃线程参与数量、或可用于参与任务处理的线程数。线程的实际数量可能动态增长和收缩。work-stealing线程池不保证提交任务的执行顺序。
a.参数:
parallelism
目标并行度级别
b.返回:
ExecutorService
新创建的线程池
c.异常
throws IllegalArgumentException
如果nThreads
个数小于等于0时
public static ExecutorService newWorkStealingPool()
创建一个work-stealing线程池,使用所有Runtime
中的availableProcessors
(可用处理器)作为其目标并行度级别。
a.参数:无
b.返回:
ExecutorService
新创建的线程池
c.异常
throws IllegalArgumentException
如果nThreads
个数小于等于0时
newSingleThreadExecutor()
public static ExecutorService newSingleThreadExecutor()
创建一个使用单个工作线程在无界队列中操作的Executor
。
请注意,如果这个单个线程由于在关闭之前的执行过程中失败而终止,如果后续任务需要执行,一个新线程将取而代之。
会保证任务按顺序执行,并且不超过一个任务,在任何给定时间内处于活跃状态。与其他等效的newFixedThreadPool(1)
不同,返回的执行器保证不可重新配置以使用其他线程。
a.参数:无
b.返回:
ExecutorService
新创建的线程池
c.异常:无
newCachedThreadPool()
public static ExecutorService newCachedThreadPool()
创建一个线程池,根据需要创建线程,但之前构建的线程可用时会复用它们。这些线程池通常会提高程序(execute
执行许多短期异步任务的)的性能。
调用execute
将复用先前构造的线程(如果可用)。如果没有可用的现有线程,则会创建一个新的线程并将其添加到线程池中。
60 秒内未使用的线程将被终止并从缓存中移除。因此,保持空闲足够长时间的线程池将不会消耗任何资源。
请注意,可以使用ThreadPoolExecutor
构造函数创建具有相似属性但不同细节(例如,超时参数)的池。
a.参数:无
b.返回:
ExecutorService
新创建的线程池
c.异常:无
newSingleThreadScheduledExecutor()
public static ScheduledExecutorService newSingleThreadScheduledExecutor()
创建一个单线程执行器executor
,它可以安排命令在给定的延迟后运行,或定期执行。
但是请注意,如果这个单一的线程在关闭之前的执行过程中由于失败而终止,如果后续任务需要执行,一个新的线程将取而代之。
会保证任务按顺序执行,并且不超过一项任务将在任何给定时间处于活跃状态。与其他等效的newScheduledThreadPool(1)
不同,返回的执行器保证不可重新配置以使用其他线程。