在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
,然后从外部(例如,从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
,值得研究一下Java 8的新特性,尤其是接口Future和实现它的类。