当前位置:首页 > 天道酬勤 > 正文内容

()

张世龙2021年12月21日 10:16天道酬勤590

一、概要

ScheduledExecutorService由ExecutorService继承,主要提供任务延迟和周期性执行的功能。 主要提供排程、排程ATFixe DRATE、排程With Fixe DELAY三种方法,分别延迟任务的执行,以特定的频率周期性地执行任务,以特定的延迟周期性地执行任务。

排程:延迟延迟一次的排程延迟时间(初始延迟、初始延迟期间、初始延迟2期间、 如…、initialDelay period等发生越境时,如果线程运行时间过长,则下次将从initialDelay 3*period开始运行,不会发生重复问题。 也就是说,我们遵循happen-before的原则。 如果线程池中有多个线程,则每次运行时都可能处于不同的线程中。 周期性执行的command,如果在执行中抛出例外而未被捕获,则此后不会执行,也就是说不再周期性执行。 scheduleWithFixedDelay也是如此。 scheduleWithFixedDelay :与每次执行的时间有关,例如每次执行都要延迟delay的时间,即第一次延迟initialDelay的执行,等执行结束后再等待delay的时间,然后再执行第二次

二、周期性任务停止执行的原因

方法scheduleAtFixedRate和scheduleWithFixedDelay表示,在执行周期性Runnable任务时,如果Runnable任务本身的run方法没有引发和捕获异常,则scheduleatfifice 1.ScheduledThreadPoolExecutor内部定义了内部类ScheduledFutureTask,ScheduledFutureTask由FutureTask继承,该内部类封装任务并周期性执行

2.ScheduledFutureTask的run方法主要通过runAndReset方法执行该周期性任务,执行成功返回true后调用setNextRunTime设置下一次的执行时间; 如果此方法返回false,则此周期性任务将停止执行,因为不会调用setNextRunTime来设置下一次执行的时间。

3 .实现3.runAndReset :如果执行任务并成功执行,则ran为true,state的值保持为NEW,因此方法的返回值为true。 但是,如果在执行过程中,即在调用c.call ()时发生异常,ran将设置为false,并在catch块中由setExeception处理。 如果在setException中将状态更新为EXCEPTIONAL,同时唤醒等待该任务结果的线程,则最终的ran s==NEW将变为false,runAndReset方法将返回false。 从上面对run的分析可以看出,此循环任务将不再执行。

4.setException方法的定义是将state更新为EXCEPTIONAL,以阻止等待任务执行结果的线程,在得知发生异常的同时,调用finishCompletion来调用这些等待线程

扫描二维码推送至手机访问。

版权声明:本文由花开半夏のブログ发布,如需转载请注明出处。

本文链接:https://www.zhangshilong.cn/work/26247.html

标签: 源码pgc
分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。