我正在开发一个必须每N秒定期启动任务(下载文件)的系统。这不是我使用Timer
和Timertask
执行此操作的问题,如下所示:
FileTimer rXMLFileTimer;
private static Timer timer = new Timer("FileReader");
rXMLFileTimer = new ReadFileTimer();
int myDelay = 30;
timer.scheduleAtFixedRate(rXMLFileTimer, 0, myDelay * 1000);
并且timertask
将一直运行,直到调用rXMLFileTimer.cancel()
。到目前为止没有问题。
现在,要求此timertask
运行,直到rXMLFileTimer.cancel()
被称为或一段时间。
我的第一种方法(没有用)是按如下方式实施Future
:
public class Test {
public static class MyJob implements Callable<ReadFileTimer> {
@Override
public ReadFileTimer call() throws Exception {
Timer timer = new Timer("test");
ReadFileTimer t = new ReadFileTimer();
int delay = 10;
// Delay in seconds
timer.schedule(t, 0, delay * 1000);
return t;
}
}
public static void main(String[] args) {
MyJob job = new MyJob();
System.out.println(new Date());
Future<ReadFileTimer> control = Executors.newSingleThreadExecutor().submit(job);
ReadFileTimer timerTask = null;
try {
int maxAmountOfTime = 30;
timerTask = control.get(maxAmountOfTime, TimeUnit.SECONDS);
} catch (TimeoutException ex) {
control.cancel(true);
} catch (InterruptedException ex) {
} catch (ExecutionException ex) {}
}
}
这不起作用,因为在超时发生后我无法调用timerTask.cancel()
。然后我的问题是:如何在给定的时间内开始timerTask
?
谢谢!
答案 0 :(得分:1)
为什么不抛出第二个计时器任务取消第一个?例如,此代码每秒打印日期十秒钟:
public static void main(String[] args) throws Exception {
Timer timer = new Timer();
final TimerTask runUntilCancelledTask = new TimerTask() {
@Override
public void run() {
System.out.println(new Date());
}
};
timer.schedule(runUntilCancelledTask, 0, 1000);
timer.schedule(new TimerTask() {
@Override
public void run() {
runUntilCancelledTask.cancel();
}
}, 10000); // Run once after delay to cancel the first task
}