JUC线程池之线程池架构

在多线程编程中,任务都是一些抽象且离散的工作单元,而线程 是使任务异步执行的基本机制。随着应用的扩张,线程和任务管理也 变得非常复杂。为了简化这些复杂的线程管理模式,我们需要一个 “管理者”来统一管理线程及任务分配,这就是线程池。

线程池的架构图大致如下:

Executor

​ Executor是Java异步目标任务的“执行者”接口,其目标是执行 目标任务。“执行者”Executor提供了execute()接口来执行已提交的 Runnable执行目标实例。Executor作为执行者的角色,其目的是提供 一种将“任务提交者”与“任务执行者”分离开来的机制。

只包含一个函数式方法:

1
void execute(Runnable command)
ExecutorService

​ 继承于Executor。他是Java异步目标任务的“执行者服务”接口,对外提供异步任务的接受服务。

提 供了“接收异步任务并转交给执行者”的方法,如:

1
2
3
4
//向线程池提交单个异步任务
<T> Future<T> submit(Callable<T> task);
//向线程池提交批量异步任务
<T> List<Future<T>> invokeAll(Collection<? extendsCallable<T>> tasks)throws InterruptedException;
AbstractExecutorService

​ AbstractExecutorService是一个抽象类,它实现了 ExecutorService接口。AbstractExecutorService存在的目的是为 ExecutorService中的接口提供默认实现。

ThreadPoolExecutor

​ ThreadPoolExecutor是JUC线程池的核心实现类,继承 于AbstractExecutorService抽象类。线程的创建和终 止需要很大的开销,线程池中预先提供了指定数量的可重用线程,所 以使用线程池会节省系统资源,并且每个线程池都维护了一些基础的 数据统计,方便线程的管理和监控。

ScheduledExecutorService

​ ScheduledExecutorService是一个接口,它继承于 ExecutorService。它是一个可以完成“延时”和“周期性”任务的调 度线程池接口,其功能和Timer/TimerTask类似。

ScheduledThreadPoolExecutor

​ ScheduledThreadPoolExecutor继承于ThreadPoolExecutor,它提 供了ScheduledExecutorService线程池接口中“延时执行”和“周期 执行”等抽象调度方法的具体实现。

​ ScheduledThreadPoolExecutor类似于Timer,但是在高并发程序 中,ScheduledThreadPoolExecutor的性能要优于Timer。

Executors

​ Executors是一个静态工厂类,它通过静态工厂方法返回 ExecutorService、ScheduledExecutorService等线程池示例对象,这 些静态工厂方法可以理解为一些快捷的创建线程池的方法。