java—如何在计时器运行时将计时器任务提交给另一个计时器

mo49yndu  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(453)

在一个 run 一个timertask对象的方法,如何将timertask本身提交给另一个计时器。当计时器任务运行时,我应该做一个判断并决定它是否可以做一些工作。如果它不符合条件,我应该取消它,并把它放在另一个计时器。我的timertask的代码如下:

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

行吗?

de90aj5v

de90aj5v1#

你应该只用一个 Timer 然后从外部监控情况,例如从 Thread ,一个 Runnable 或者别的 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();

另请注意 Runnable , Timer 以及 Thread 值得一看Java8的新特性,特别是未来的接口和实现它的类。

相关问题