目录
- 简介
- Executor框架的两级调度模型
- Executor框架的组成
- ExecutorService生命周期
- Executors工具类介绍
1. 简介
在Java 5之后,并发编程引入了一堆新的启动、调度和管理线程的API。Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。
2. Executor框架的两级调度模型
在HotSpot VM的线程模型中,Java线程(java.lang.Thread)被一对一映射为本地操作系统线程。Java线程启动时会创建一个本地操作系统线程;当该Java线程终止时,这个操作系统线程也会被回收。操作系统会调度所有线程并将它们分配给可用的CPU。
在上层,Java多线程程序通常把应用分解为若干个任务,然后使用用户级的调度器(Executor框架)将这些任务映射为固定数量的线程;在底层,操作系统内核将这些线程映射到硬件处理器上
3. Executor框架的组成
- 任务
- 任务的执行
- 异步计算的结果
3.1 任务
接口 | 说明 |
---|---|
Runnable | 不带返回值的异步线程接口 |
Callable | 带返回值的异步线程接口 |
3.2 任务的执行
接口 | 说明 |
---|---|
Executor | 它是Executor框架的基础,提供了execute()线程运行接口 |
Executors | 定义了不同类型的线程池创建的通用接口 |
ThreadPoolExecutor | 是线程池的核心实现类,用来执行被提交的任务 |
ScheduledThreadPoolExecutor | 是一个实现类,可以在给定的延迟后运行命令,或者定期执行命令。 |
3.3 异步计算的结果
接口 | 说明 |
---|---|
Future | 获取异步线程Callable的返回值 |
FutureTask | 实现Future接口 |
4. ExecutorService生命周期
- 运行 执行了 execute或者submit方法
- 关闭 执行了shutdown方法
- 终止 所有线程运行完成
5. Executors工具类介绍
5.1 定长线程池 newFixedThreadPool(int nThreads)
源码:
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
特征:
- 核心线程数和最大线程数相同
- 当线程池中的线程数大于corePoolSize时,空闲线程立即被终止
- 使用无界队列LinkedBlockingQueue作为线程池的工作队列,运行中的FixedThreadPool不会拒绝任务
5.2 单例线程池newSingleThreadExecutor()
源码:
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
特征:
- 如果当前运行的线程数少于corePoolSize(即线程池中无运行的线程),则创建一个(也仅有一个)新线程来执行任务
- 空闲线程会立即终止
- 使用无界队列LinkedBlockingQueue作为线程池的工作队列,运行中的FixedThreadPool不会拒绝任务
5.3 可缓存线程池newCachedThreadPool()
源码:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
特征:
- 最大可以创建Integer.MAX_VALUE的线程数
- 空闲线程会在60秒后回收
- SynchronousQueue是一个没有容量的阻塞队列。每个插入操作必须等待另一个线程的对应移除操作,反之亦然
5.4 延期线程池newScheduledThreadPool()
源码:
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue());
}
ScheduledThreadPoolExecutor 方法介绍
scheduleAtFixedRate(Runnable command,//执行线程
long initialDelay,//初始化延迟
long period,//两次开始的执行的最小时间间隔
TimeUnit unit)//计时单位