如何在运行时向另一个Timer提交TimerTask

时间:2017-10-31 13:56:41

标签: 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();
    }

它会起作用吗?

1 个答案:

答案 0 :(得分:1)

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

这里是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以及实现它的类。