Java 并发之 ScheduledThreadPoolExecutor 原理分析
来源:互联网 发布:单片机软件原理 编辑:程序博客网 时间:2024/05/29 06:50
写完了发现这么少。。。
从 ScheduledThreadPoolExecutor
这个名字就可以看出,这货 extends 了 ThreadPoolExecutor
。而大家都知道,在 ThreadPoolExecutor
的构造方法里有一个比较重要的参数是 BlockingQueue
。ScheduledThreadPoolExecutor
的特殊之处便在于它有一个 BlockingQueue
的内部实现类 DelayedWorkQueue
。
DelayedWorkQueue
这个 DelayedWorkQueue
和另一个 BlockingQueue
的实现 DelayQueue
很像。都是通过二叉堆算法实现排序,同样是在取操作的时候会 block 住知道 delay 到期。不同的是 DelayedWorkQueue
并没有采用 PriorityQueue
,而是自己实现的二叉堆算法,不知道这是为什么(我猜是因为同是 1.5 新类,所以没有重用)。
根据二叉堆的定义,DelayedWorkQueue
中的元素第一个元素永远是 delay 时间最小的那个元素,如果 delay 没有到期,take 的时候便会 block 住。
了解了 DelayedWorkQueue
,理解 ScheduledThreadPoolExecutor
就容易了。当执行 schedule 方法是。如果不是重复的任务,那任务从 DelayedWorkQueue
取出之后执行完了就结束了。如果是重复的任务,那在执行结束前会重置执行时间并将自己重新加入到 DelayedWorkQueue
中。这在第 295 行有体现:
public void run() { boolean periodic = isPeriodic(); if (!canRunInCurrentRunState(periodic)) cancel(false); else if (!periodic) ScheduledFutureTask.super.run(); else if (ScheduledFutureTask.super.runAndReset()) { setNextRunTime(); reExecutePeriodic(outerTask); // 把自己重新加入到队列中 }}
总结
其实只要你理解了 DelayedWorkQueue
便能很容易理解 ScheduledThreadPoolExecutor
的工作原理了。
- Java 并发之 ScheduledThreadPoolExecutor 原理分析
- Java并发编程-Executor框架之ScheduledThreadPoolExecutor
- 【Java并发】- ScheduledThreadPoolExecutor, ScheduledExecutorService使用
- Java并发编程之ConcurrentHashMap原理分析
- 【死磕Java并发】-----J.U.C之线程池:ScheduledThreadPoolExecutor
- Java并发之atomic包的原理及分析
- Java线程调度器ScheduledThreadPoolExecutor 分析
- Java调度线程池ScheduledThreadPoolExecutor源码分析
- java--ScheduledThreadPoolExecutor
- ScheduledThreadPoolExecutor Java
- Java 多线程之 ScheduledThreadPoolExecutor 定时任务
- (二十)java多线程之ScheduledThreadPoolExecutor
- Java 并发 使用 ScheduledThreadPoolExecutor进行温室参数变化仿真
- Java并发之AbstractQueuedSynchronizer分析
- java并发前身CAS原理深度分析
- Java Thread&Concurrency(15): 深入理解ScheduledThreadPoolExecutor及其实现原理
- Java中调度线程池ScheduledThreadPoolExecutor原理探究
- Java中调度线程池ScheduledThreadPoolExecutor原理探究
- GIAC 2017全球互联网架构大会日程提前看!
- tf.Variable()
- 逻辑层 applicationContext-service.xml
- jsp页面与后台进行交流传值(java)
- 大白话讲解Promise(一)
- Java 并发之 ScheduledThreadPoolExecutor 原理分析
- poj 1063 找规律题目
- Hive中union使用详情
- 事物处理 applicationContext.xml
- AndroidStudio修改项目名称
- caffe系列之激活函数
- S08IO库
- 记一次线上事故,redis 的keys问题,cpu引起的性能问题
- 《APP研发录》笔记