ScheduledThreadPool如何实现定时执行及其它问题概述

一、如何实现定时执行

关键组件:DelayedWorkQueue、ScheduledFutureTask;

DelayedWorkQueue

Specialized delay queue(延迟队列:是一个无界的BlockingQueue,其中的对象只能在其到期时才能从队列中取走,且队头对象的延迟到期时间最长(heap-based data structure))。

在ScheduledThreadPoolExecutor类中定义,队列中元素类型为ScheduledFutureTask;

ScheduledFutureTask

主要实现run方法,以及辅助延迟队列实现的compareTo(根据执行时间&顺序号排序)、setNextRunTime(FixedRate模式:next_time=本次执行时间+间隔时间;FixedDelay模式:next_time=当前时间+间隔时间;正如两个模式的定义)方法;

run中的主要逻辑:(仅关注周期任务scheduleAtFixedRate/scheduleAtFixedDelay)执行当前任务,若成功,则设置自身下一次执行time,并放入队列;

二、常见问题

1. 在FixedRate模式下,假设每秒触发,如果某次任务执行时间超过间隔时间,后续任务会不会并发执行?

2. 如果任务抛出了异常,后续任务是否继续执行?

通过源码(runAndReset仅在task运行成功返回true),显然本次任务运行没有运行完成时,后续任务不会加入队列,不会并发执行;若任务抛出了异常,runAndReset方法返回false,不满足条件,不会有后续任务加入队列,故后续任务不会执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值