如何启动一个定期执行但在一段固定时间内执行的定时器

时间:2014-10-31 16:53:38

标签: java timer future timertask

我正在开发一个必须每N秒定期启动任务(下载文件)的系统。这不是我使用TimerTimertask执行此操作的问题,如下所示:

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

谢谢!

1 个答案:

答案 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
}