加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

当定时器中安排了Java TimerTask时,是否已经执行了?

发布时间:2020-12-14 23:47:46 所属栏目:Java 来源:网络整理
导读:我想澄清一下有关TimerTask的内容.当你有下面的代码: timer.schedule(task,60000); 任务计划在接下来的1分钟内运行,任务对象是否已经执行? 因为我的代码中的某个地方我调用了task.cancel(),但似乎这个调用并没有阻止 任务执行.我甚至从调用记录返回值,它返
我想澄清一下有关TimerTask的内容.当你有下面的代码:
timer.schedule(task,60000);

任务计划在接下来的1分钟内运行,任务对象是否已经执行?

因为我的代码中的某个地方我调用了task.cancel(),但似乎这个调用并没有阻止

任务执行.我甚至从调用记录返回值,它返回false.

当我阅读取消方法的文档时,我遇到了我的问题:

Cancels the TimerTask and removes it from the Timer’s queue.
Generally,it returns false if the call did not prevent a TimerTask
from running at least once. Subsequent calls have no effect. Returns true if the call prevented a scheduled execution from taking place,false otherwise.

我相信我在1分钟延迟之前调用了cancel().但是如何取消返回false,

[任务]是否已经执行?

希望你可以给我提供线索/提示甚至是解释.谢谢你!

解决方法

>任务计划在接下来的1分钟内运行,任务对象已经执行

不,它将在60秒内调用此任务的run方法.如果task.cancel()返回false,那可能意味着3件事情:

>该任务已安排一次性执行,并已运行OR
>任务从未安排OR
>任务已经取消或

因此,如果您确定在调度任务之后60秒之前呼叫取消,您可能可能会调用它多次,并获得后续取消的结果,或者您正在调用另一个任务中的取消.

一般来说,我建议Timer赞成ScheduledExecutorService

您可以通过以下方式实现所需的功能:

ScheduledExecutorService.schedule( callable,delay,timeunit )

为什么ScheduledExecutorService是一个首选方式的原因概述here:

> Timer可以对系统时钟的变化敏感,ScheduledThreadPoolExecutor不是> Timer只有一个执行线程,所以长时间运行的任务可以延迟其他任务. ScheduledThreadPoolExecutor可以配置任意数量的线程.此外,您可以完全控制创建的线程,如果需要(通过提供ThreadFactory)> TimerTask中抛出的运行时异常kill一个线程,从而使计时器死机:-( …即计划任务不再运行.ScheduledThreadExecutor不仅捕获运行时异常,而且可以让您处理它们(通过覆盖afterExecute方法从ThreadPoolExecutor).抛出异常的任务将被取消,但其他任务将继续运行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读