目录
3、ThreadPoolExecutor(ExecutorService的第一个实现类)
4、SchemedThreadPoolExecutor(ExecutorService的第二个实现类)
1、Executor框架的2级调度模型
在多线程的程序里面有非常多的任务,比如线程池里面,我们不断会往阻塞队列里面提交各种任务(task),各种任务经过Executor框架完成第一级的任务调度,将这些任务映射为线程池里面固定数量的线程。然后操作系统内核会将这些线程映射到具体的cpu上,这就是第二季的任务调度。
2、Executor框架的结构
主要包括三部分:
- 任务:被执行的任务需要实现runnable接口或者callable接口。
- 任务的执行:主要是ExecutorService接口的两个实现类-----ThreadPoolExecutor和SchemedThreadPoolExecutor类。
- 返回的结果:包括Future接口和实现Future接口的FutureTask类
3、ThreadPoolExecutor(ExecutorService的第一个实现类)
ThreadPoolExecutor原本可以根据需要的核心线程数,最大线程数等等自己来设计线程池,但是Executor框架还提供了另外三个类,这三个类是对ThreadPoolExecutor的不同的封装,比如fixThreadPool的最大线程数和核心线程数都是一样的,SingleThreadPool的核心线程数和最大线程数都是1,比如CachedThreadPool的核心线程数是0,最大线程数是Integer.MAX_VALUE也就是无限的,即如果提交任务的速度超多线程的执行速度,就会一直创建线程,直到耗尽内存资源。
4、SchemedThreadPoolExecutor(ExecutorService的第二个实现类)
Scheme是表示计划,日程,这就表示这个线程池里面运行的任务都是定期定时执行的。这个线程池会使用delayQueue作为任务队列,这是一个无界队列,并且里面存放的任务类型为:SchemedFutureTask。这个类型的任务有三个成员变量:
- time:任务要被执行的具体时间
- period:任务执行的间隔周期
- sequence number:任务被添加到SchemedThreadPoolExecutor的顺序。
这个队列同时也是一个优先级队列,会根据time的大小排序,小的排前面,如果time相同,则根据sequence number排序。
SchemedThreadPoolExecutor执行任务的过程如下图所示:
首先在队列里面获取任务,如果当前的时间不符合队列头的time等待,一直等到第一个任务到期,取出来执行,然后把这个任务的time修改,也就是加上一个period,然后再放回队列里面。