如何立即停止Java.util.Timer类中预定的任务

5
我尝试了所有方法,包括这个:如何停止Java.util.Timer类中的任务调度 我有一个实现java.util.TimerTask的任务。
我以两种方式调用该任务:
  1. 我像这样安排计时器:

    timer.schedule(timerTask, 60 * 1000);

  2. 有时我需要立即启动该工作,并且必须取消正在运行的timerTask。

    cancelCurrentWork(); timer.schedule(timerTask, 0);

此实现不会停止当前工作: (文档说明:如果在发生此调用时任务正在运行,则任务将运行完成,但永远不会再次运行)
但是我需要它停止。
public static void cancelCurrentwork() {
 if (timerTask!= null) {
  timerTask.cancel();
 }
}

这个实现只是取消了计时器,但允许当前正在执行的任务完成。

public static void cancelCurrentwork() {
 if (timer!= null) {
  timer.cancel();
 }
}

在计时器中是否有一种方法可以停止当前正在执行的任务,类似于Thread.kill()或其他方式?当我需要停止该任务时,我希望它失去所有数据。

2个回答

6

定时器无法立即停止任务。

您需要在正在运行的任务中拥有一个单独的机制来检查它是否应该继续运行。例如,您可以拥有一个AtomicBoolean keepRunning变量,当您想要终止任务时将其设置为false。


如何在任务内部停止工作?我可以使用布尔值进行检查,但是接下来应该调用哪个方法?this.cancel()吗? - vale4674
1
另外一个问题:是否有任何类似ScheduledExecutorService的API或类允许您停止任务? - vale4674
不,你只需从run方法返回。 - aioobe
是的,看起来它似乎可以解决问题。但这并不是那么“优雅”。因为我的run()方法包含了一些方法,每个方法都需要一些时间来工作。其中一些方法没有while循环来不断检查布尔值。所以你看,我需要它立即停止,而不是在任务意识到布尔值已经设置为false之后才停止。 - vale4674
如果有阻塞方法,你需要使用 interrupt 来中断它。 - aioobe
做了那个之后,我只需要捕获那个异常并从run()函数返回。谢谢。 - vale4674

0

如果您的计时器正在使用某种文件/套接字等,您可以从计时器外部关闭该对象,计时器任务将抛出异常,您可以使用它来停止计时器。

但通常情况下,您需要某种毒丸才能成功停止单独的线程/计时器。


是的,但问题就在这里。没有办法立即停止它,我真的不明白这是怎么可能的。 - vale4674
无论如何,我使用了来自aioobe的建议,并且不断检查我的标志,然后从“run”方法返回。 - vale4674

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接