ScheduledThreadPoolExecutor详解

来源:互联网 发布:硬笔书法字帖推荐 知乎 编辑:程序博客网 时间:2024/05/18 03:02

ScheduledThreadPoolExecutor与Timer类似,Timer对应的是单个后台线程,而ScheduledThreadPoolExecutor可以在构造函数中指定多个对应的后台线程数


ScheduledThreadPoolExecutor会把待调度的任务(ScheduledFutureTask)放到一个DelayQueue中。


执行任务步骤:

1.线程1从DelayQueue中获取已到期的ScheduledFutureTask(DelayQueue.take())。

2.线程1执行这个ScheduledFutureTask

3.线程1修改ScheduledFutureTask的time变量为下次将要被执行的时间

4.线程1把这个修改time之后的ScheduledFutureTask放回


DelayQueue中DelayQueue封装了一个PriorityQueue,这个PriorityQueue会对队列中的ScheduledFutureTask进行排序


获取任务步骤:

1.获取Lock

2.获取周期任务:

2.1如果PriorityQueue为空,当前线程到Condition中等待;否则执行2.2

2.2如果PriorityQueue的头元素的time时间比当前时间大,到Condition中等待到time时间;否则执行2.3

2.3获取PriorityQueue的头元素;如果PriorityQueue不为空,则唤醒在Condition中等待的所有线程

3.释放Lock


添加任务步骤:

1.获取Lock2.添加任务:

2.1向PriorityQueue添加任务

2.2如果在2.1中添加的任务是PriorityQueue的头元素,唤醒在Condition中等待的所有线程

3.释放Lock

阅读全文
0 0