ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ScheduledThreadPoolExecutor

ScheduledThreadPoolExecutor ScheduledThreadPoolExecutor实现ScheduledExecutorService接口实现了一些定时任务处理的方法。public interface ScheduledExecutorService extends ExecutorService { ScheduledFuture? schedule(Runnable var1, long var2, TimeUnit var4); V ScheduledFutureV schedule(CallableV var1, long var2, TimeUnit var4); ScheduledFuture? scheduleAtFixedRate(Runnable var1, long var2, long var4, TimeUnit var6); ScheduledFuture? scheduleWithFixedDelay(Runnable var1, long var2, long var4, TimeUnit var6); }scheduleRunnable ...一次性延迟任务。在delay时间后执行一次Runnable不关心返回值返回ScheduledFuture?只能拿状态/取消拿不到结果。schedule(CallableV...)同样是一次性延迟但传Callable而非Runnable执行完有返回值ScheduledFutureV.get()能拿到计算结果。适合延迟后算点东西并返回的场景。scheduleAtFixedRate以period为间隔来触发任务的每间隔period后检查任务是否执行完毕来决定是否立刻执行下一次任务如果上一次任务没执行完则等待执行完后立刻执行下一次任务。即首次在initialDelay后执行之后以上一次任务开始时间为基准每隔period触发下一次。关键行为若某次任务执行耗时超过period下一次会紧接着上一次结束后立即执行不会并发重叠但频率被拉长。严格按开始时间对齐理论周期恒定。例如period5s任务跑 2s → 0s 开始、2s 结束、5s 又开始若任务跑 8s → 0s 开始、8s 结束、8s 又立即开始被拖慢。实际应用场景下如果任务执行耗时小于period则相当于每隔period时间触发一次任务执行但是如果任务执行耗时大于period间隔本身则会连续不断地执行任务。任务触发的间隔最小是period最大是任务执行耗时耗时大于period时scheduleWithFixedDelay这个方法是在每次任务执行完成后延迟delay时间后触发下一次任务执行。不管任务command执行的时间是多长下一次任务的执行时间都是上一次任务执行完后在等待延迟间隔delay时间后执行下一次任务。即首次在initialDelay后执行之后以上一次任务结束时间为基准等待delay后再执行下一次。关键行为无论任务跑多久两次执行之间永远间隔固定的delay结束 → 等 delay → 再开始。周期 任务耗时 delay不恒定。private ScheduledThreadPoolExecutor scheduledPool new ScheduledThreadPoolExecutor(1); //间隔60s执行一次refreshToken方法 scheduledPool.scheduleAtFixedRate(() - this.refreshToken(),0, 60,TimeUnit.SECONDS);
返回列表