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

前端之家收集整理的这篇文章主要介绍了当定时器中安排了Java TimerTask时,是否已经执行了?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想澄清一下有关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).抛出异常的任务将被取消,但其他任务将继续运行.

猜你在找的Java相关文章