网站建设丨找王科杰效果好,网站防盗链设置,久久建筑网下载教程,wordpress 多语言插件ScheduledThreadPoolExecutor 是在线程池的基础上 拓展的定时功能的线程池#xff0c;主要有四种方式#xff0c;具体可以看代码#xff0c; 这里主要描述下
scheduleAtFixedRate #xff1a; 除了第一次执行的时间#xff0c;后面任务执行的时间 为 time MAX(任务执行时…ScheduledThreadPoolExecutor 是在线程池的基础上 拓展的定时功能的线程池主要有四种方式具体可以看代码 这里主要描述下
scheduleAtFixedRate 除了第一次执行的时间后面任务执行的时间 为 time MAX(任务执行时间每次等待时间) 取最大值scheduleWithFixedDelay除了第一次执行的时间后面任务的时间为 任务执行时间每次等待时间。
使用案例 // 创建一个定时任务线程池ScheduledThreadPoolExecutor executor new ScheduledThreadPoolExecutor(1);// 延迟1S后执行executor.schedule(() - {}, 1000, TimeUnit.MILLISECONDS);// 立马执行executor.execute(() - {System.out.println(execute);});// 第一次延迟1S之后每3S执行一次如果任务时间超过3S那么等任务执行后执行下一次任务executor.scheduleAtFixedRate(() - {try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(atnew Date());}, 1000, 3000, TimeUnit.MILLISECONDS);// 第一次延迟1S执行。任务执行完成后3S 执行下一次任务executor.scheduleWithFixedDelay(() - {try {TimeUnit.SECONDS.sleep(5);System.out.println(withnew Date());} catch (InterruptedException e) {throw new RuntimeException(e);}},1000, 3000, TimeUnit.MILLISECONDS);
源码解析
其实主要就是把握ScheduledFutureTask 和 线程池的核心流程的类就可以。
ScheduledFutureTask DelayedWorkQueue
本质是一个二叉树形式的堆结构会将邻近执行时间的任务排在前面。
schedule 方法分析
整体的流程其实就是 封装定时任务然后触发延迟执行。
delayedExecute ScheduledFutureTask.run方法 流程图
这里来简单描述下整体的流程 1.先将任务封装成一个任务 ScheduledFutureTask, 根据线程池状态判断是否执行或者删除任务 2.将任务添加到延迟队列中 3.根据线程池配置 看是否创建线程执行任务。 4.运行的线程不断从延迟队列中获取任务执行。
其实本质就是利用线程池复用机制 延迟队列 实现定时任务。 总结
ScheduledThreadPoolExecutor和ThreadPoolExecutor的区别
ThreadPoolExecutor每次addwoker就会将自己的Task传进新创建的woker中的线程执行因此woker会第一时间执行当前Task只有线程数超过了核心线程才会将任务放进队列里ScheduledThreadPoolExecutor是直接入队列并且创建woker时传到woker的是null说明woker中的线程刚启动时并没有任务执行只能通过getTask去队列里取任务取任务时会判断是否到了执行时间因此具有了延时执行的特性并且task执行完了会将当前任务重新放进堆里并设置下次执行的时间。