【问题标题】:How to submit a TimerTask to another Timer when it 's running如何在 TimerTask 运行时将 TimerTask 提交给另一个 Timer
【发布时间】:2017-10-31 13:56:41
【问题描述】:

在 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 或另一个Timer。然后根据需要从外部监视器停止、取消、重新分配、启动计时器。

标签: java timer timertask


【解决方案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 和实现的类它。

【讨论】:

    最近更新 更多