当最后一个没有完成时,如何让Timer跳过任务?

时间:2013-10-19 02:56:38

标签: java timer timertask

以下是代码段:

Timer t = new Timer();
TimerTask task = new TimerTask() {
    int i = 0;
    int longTimeJobPoint = 2;
    @Override
    public void run() {
        System.out.println(new Date());
        if(++i == longTimeJobPoint)    {
            try {
                System.out.println("sleeping time...");
                Thread.sleep(30000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

};

//every 10 sec
t.scheduleAtFixedRate(task, new Date(), 10000);

结果如下:

Sat Oct 19 10:44:59 CST 2013
Sat Oct 19 10:45:09 CST 2013
sleeping time...
Sat Oct 19 10:45:39 CST 2013  //piled task
Sat Oct 19 10:45:39 CST 2013  //piled task
Sat Oct 19 10:45:39 CST 2013
Sat Oct 19 10:45:49 CST 2013

正如我们所看到的,当Thread.sleep()延迟30秒时,计划的计时器堆积应该每10秒调用一次的任务。我想要的是跳过由于上一个任务尚未完成而延迟的任务。输出应该是这样的:

Sat Oct 19 10:44:59 CST 2013
Sat Oct 19 10:45:09 CST 2013
sleeping time...
Sat Oct 19 10:45:39 CST 2013
Sat Oct 19 10:45:49 CST 2013

有人能给我一些帮助吗?非常感谢!

1 个答案:

答案 0 :(得分:1)

您应该使用fixed-delay execution代替它,它将根据上一个任务的完成时间而不是其开始时间开始下一个任务。如果Timer不支持您所需的内容,请查看功能更强大的调度库,例如Quartz