在Timer中调度Java TimerTask时,它是否已经“正在执行”?

我想澄清一下有关TimerTask的内容。 如果您有以下代码:

timer.schedule(task, 60000); 

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

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

要执行的任务。 我甚至记录了来自调用的返回值,它返回false。

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

取消TimerTask并将其从Timer的队列中删除。 通常,如果调用没有阻止TimerTask至少运行一次,则返回false。 后续调用无效。 如果调用阻止了计划执行,则返回true,否则返回false。

我相信我在1分钟的延迟之前打电话给cancel()。 但是如何取消返回false,

是[任务]已经执行了吗?

希望你能给我提供线索/提示甚至解释。 谢谢!

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

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

  • 任务被安排一次性执行,并且已经运行了OR
  • 任务从未安排过
  • 任务已被取消或

因此,如果您确定在安排任务后60秒之前调用cancel ,则可能会多次调用它,并从后续cancel获取结果,或者您在其他任务上调用取消。


一般来说,我建议不要使用Timer来支持ScheduledExecutorService

您可以通过以下方式实现所需的function

ScheduledExecutorService.schedule(可调用,延迟,timeunit)

这里概述了 ScheduledExecutorService是首选方法的原因:

  • 定时器可以对系统时钟的变化敏感,而ScheduledThreadPoolExecutor则不然

  • Timer只有一个执行线程,因此长时间运行的任务可以延迟其他任务。 ScheduledThreadPoolExecutor可以配置任意数量的线程。 此外,如果需要,您可以完全控制创建的线程(通过提供ThreadFactory)

  • 在TimerTask中抛出的运行时exception会杀死一个线程,从而使得计时器死机:-(…即计划任务将不再运行.ScheduledThreadExecutor不仅捕获运行时exception,而且它允许您根据需要处理它们(通过覆盖afterExecute方法) ThreadPoolExecutor)。抛出exception的任务将被取消,但其他任务将继续运行。

我不知道为什么你的代码返回false

以下代码打印为true

 import java.util.Timer; import java.util.TimerTask; public class Test { public static void main(String[] args) { Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { System.out.println("hi"); } }; timer.schedule(task, 60000); System.out.println(task.cancel()); } } 

如果评论了最后一个println ,则程序打印hi