目录

1、Executor框架的2级调度模型

2、Executor框架的结构

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执行任务的过程如下图所示:

Executor框架浅析

首先在队列里面获取任务,如果当前的时间不符合队列头的time等待,一直等到第一个任务到期,取出来执行,然后把这个任务的time修改,也就是加上一个period,然后再放回队列里面。 

相关文章: