在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)监视状态。然后根据需要从外部监视器停止,取消,重新分配和启动计时器。



这是一个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和实现它的类。

09-27 20:37
查看更多