【问题标题】:How to stop immediately the task scheduled in Java.util.Timer class如何立即停止在 Java.util.Timer 类中安排的任务
【发布时间】:2011-05-02 07:34:22
【问题描述】:

我什么都试过了。这个也是How to stop the task scheduled in Java.util.Timer class

我有一个实现 java.util.TimerTask 的任务

我以两种方式调用该任务:

  1. 我这样安排定时器:

    timer.schedule(timerTask, 60 * 1000);

  2. 有时我需要立即开始这项工作,如果有任何工作正常,它必须取消 timerTask

    取消当前工作(); timer.schedule(timerTask, 0);

此实现不会停止当前的工作: (文档说:如果这个调用发生时任务正在运行,任务将运行到完成,但永远不会再次运行)

但我需要它停下来。

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

这个实现只是取消了计时器,但是让当前正在做的任务被完成。

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

定时器中有没有办法停止当前正在执行的任务,比如 Thread.kill() 之类的?当我需要停止该任务时,我希望它释放所有数据。

【问题讨论】:

    标签: java timer scheduled-tasks schedule


    【解决方案1】:

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

    但一般来说,您需要某种毒丸才能成功停止单独的线程/计时器。

    【讨论】:

    • 是的,但就是这样。没有办法立即阻止它,我真的不明白这怎么可能。
    • 无论如何我使用了来自 aioobe 的建议,我不断检查我的标志,然后从“运行”方法返回。
    【解决方案2】:

    计时器无法停止任务。

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

    【讨论】:

    • 如何从任务内部停止工作?我可以用布尔值检查,但是我应该调用什么方法呢? this.cancel()?
    • 还有其他问题:像 ScheduledExecutorService 之类的 API 是否允许您停止任务?
    • 不,你只是从run方法返回。
    • 是的,看起来它可以解决问题。但这并不是那么“优雅”。因为我的 run() 方法包含的方法很少,而且每个方法都需要一些时间来工作。其中一些没有 while 循环来不断检查该布尔值。如您所见,我需要它立即停止,而不是在任务意识到布尔值设置为 false 之后。
    • 如果有阻塞方法,你必须interrupt它。
    猜你喜欢
    • 2010-11-27
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    相关资源
    最近更新 更多