java - 如何在运行时将 TimerTask 提交给另一个 Timer

标签 java timer timertask

在 TimerTask 对象的 run 方法中,如何将 timerTask 本身提交给另一个 Timer。 当timerTask运行的时候,我应该做一个判断,决定它能不能做一些工作。如果不满足条件,我应该取消它并把它放到另一个定时器。 我的 TimerTask 的代码是这样的:

@Override
public void run() {
    try {
        if (flag) {
           // do something
        } else {
           new Timer().schedule(this, 1000 * 60);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

它会起作用吗?

最佳答案

您应该只使用一个 Timer,然后从外部监控条件,例如从 ThreadRunnable 或另一个 计时器。然后根据需要从外部监视器停止、取消、重新分配、启动计时器。


这是一个TimerTask:

public class OurTask extends TimerTask {
    @Override
    public void run() {
        // Do something
    }
}

这是监视器:

public Monitor implements Runnable() {
    private Timer mTimerToMonitor;

    public Monitor(Timer timerToMonitor) {
        this.mTimerToMonitor = timerToMonitor;
    }

    @Override
    public void run() {
        while (true) {
            if (!flag) {
                // Cancel the timer and start a new
                this.mTimerToMonitor.cancel();
                this.mTimerToMonitor = new Timer();
                this.mTimerToMonitor.schedule(...);
            }

            // Wait a second
            Thread.sleep(1000);
        }
    }
}

请注意,实际上您的 Monitor 也应该能够从外部取消,目前它会无限运行。

你可以这样调用它:

Timer timer = new Timer();
timer.schedule(new OurTask(), ...);

Thread monitorThread = new Thread(new Monitor(timer));
monitorThread.start();

另请注意,与其使用 RunnableTimerThread,不如看看新的 Java 8 东西,尤其是界面 Future和实现它的类。

关于java - 如何在运行时将 TimerTask 提交给另一个 Timer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47037195/

相关文章:

java - Cassandra Java 驱动程序 3 EnumNameCodec

java - 为什么 Stack 使用基于 1 的索引而不是像 Java 中的数组那样使用基于 0 的索引?

java - 如何将油漆(图形g)添加到另一个类中?

android - 如何取消定时器并更新同一个定时器?

java - 我如何获取在另一个类的方法中获取值的数组

java - 从 JPEG 图像读取数据

java - indexoutofboundexception : setSpan (2. ..2) 超出长度 1

Swift 计时器检查 TouchesEnded

.net - DispatcherTimer 与 WPF 应用程序中用于任务调度程序的常规 Timer

java - 在JAVA循环中每x秒使用不同参数执行一个方法