Java定时任务之--schedule与scheduleAtFixedRate异同

相同点:

任务执行未超时,下次执行时间 = 上次执行开始时间 + period;

任务执行超时,下次执行时间 = 上次执行结束时间;

在任务执行未超时时,它们都是上次执行时间加上间隔时间,来执行下一次任务。而执行超时时,都是立马执行。

区别点:

schedule侧重保持间隔时间的稳定

scheduleAtFixedRate侧重保持执行频率的稳定

如果用一句话来描述任务执行超时之后schedule和scheduleAtFixedRate的区别就是:

schedule的策略是错过了就错过了,后续按照新的节奏来走;scheduleAtFixedRate的策略是如果错过了,就努力追上原来的节奏(制定好的节奏)。

 下面通过测试代码、分析日志来验证上面的说法:

任务执行未超时,下次执行时间 = 上次执行开始时间 + period;

public class MyTimerTask {
    private static final Logger logger = LoggerFactory.getLogger(MyTimerTask.class);

    public static void main(String[] args) {
        test2();
    }

    private static void test2() {
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                logger.info("------------------timer task start");
               
                logger.info("------------------timer task end");
            }
        };

        logger.info("test2 start");
        Timer timer = new Timer();
        timer.schedule(task, 0, 1000);
//      timer.scheduleAtFixedRate(task, 0, 1000);
        logger.info("test2 end");
    }
}

日志如下:任务执行未超时的情况下,下次任务执行时间 = 上次任务结束时间 + period;

10:43:28.760 [main] INFO com.massmeet.mytimer.service.MyTimerTask - test2 start
10:43:28.765 [main] INFO com.massmeet.mytimer.service.MyTimerTask - test2 end
10:43:28.765 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:43:28.765 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:43:29.777 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:43:29.777 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:43:30.791 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:43:30.791 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:43:31.803 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:43:31.803 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:43:32.804 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:43:32.804 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end

任务执行超时,下次执行时间 = 上次执行结束时间;

public class MyTimerTask {
    private static final Logger logger = LoggerFactory.getLogger(MyTimerTask.class);

    public static void main(String[] args) {
        test2();
    }

    private static void test2() {
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                logger.info("------------------timer task start");
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                logger.info("------------------timer task end");
            }
        };

        logger.info("test2 start");
        Timer timer = new Timer();
        timer.schedule(task, 0, 1000);
//        timer.scheduleAtFixedRate(task, 0, 1000);
        logger.info("test2 end");
    }
}

日志如下:任务执行超时的情况下,下次任务的启动时间 = 上次任务的结束时间。

10:48:40.435 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:48:43.443 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:48:43.443 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:48:46.450 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:48:46.450 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:48:49.463 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:48:49.463 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:48:52.465 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:48:52.465 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start

以上示例验证相同点,是可以的。但是对于区别点,存在一定的问题。因为每个任务都存在相同的延时,无法验证两个方法的侧重点。所以,设计了下面的代码来验证区别点:

schedule:运行定时任务,间隔1s运行一次。每五次任务重有一次会运行超时3s。
public class MyTimerTask {
    private static final Logger logger = LoggerFactory.getLogger(MyTimerTask.class);

    public static void main(String[] args) {
        test3();
    }

    private static void test3() {
        TimerTaskTest task = new TimerTaskTest();

        logger.info("test3 start");
        Timer timer = new Timer();
        timer.schedule(task, 0, 1000);
        logger.info("test3 end");
    }

    static class TimerTaskTest extends TimerTask {
        int i = 0;

        @Override
        public void run() {
            logger.info("------------------timer task start");
            if (i % 5 == 0) {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            logger.info("++++++++++++++++++++++++++++++" + i);
            i++;
            logger.info("------------------timer task end");
        }

    }
}

日志如下:

10:57:58.254 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:58:01.263 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++0
10:58:01.263 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:58:01.263 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:58:01.263 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++1
10:58:01.263 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:58:02.267 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:58:02.267 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++2
10:58:02.267 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:58:03.270 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:58:03.270 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++3
10:58:03.270 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:58:04.275 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:58:04.275 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++4
10:58:04.275 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:58:05.278 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:58:08.285 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++5
10:58:08.285 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:58:08.285 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:58:08.285 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++6
10:58:08.285 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:58:09.291 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:58:09.291 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++7
10:58:09.291 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:58:10.292 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:58:10.292 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++8
10:58:10.292 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:58:11.307 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:58:11.307 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++9
10:58:11.307 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:58:12.314 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:58:15.318 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++10
10:58:15.318 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:58:15.318 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:58:15.318 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++11
10:58:15.318 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:58:16.319 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:58:16.319 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++12
10:58:16.319 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:58:17.323 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:58:17.323 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++13
10:58:17.323 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:58:18.336 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:58:18.336 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++14
10:58:18.336 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:58:19.345 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:58:22.354 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++15
10:58:22.354 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:58:22.354 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:58:22.354 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++16
10:58:22.354 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
10:58:23.367 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
10:58:23.367 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++17
10:58:23.367 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end

schedule 执行任务超时,第N个任务会在  N-1个任务执行完成后,不做period等待,立即启动执行;N任务执行未超时,N+1个任务会在N任务执行完成后,等待period,再执行。

即:schedule侧重时间间隔的稳定,错过了就错过了,后续按照新的节奏走。

scheduleAtFixedRate:运行定时任务,间隔1s运行一次。每五次任务重有一次会运行超时3s。
public class MyTimerTask {
    private static final Logger logger = LoggerFactory.getLogger(MyTimerTask.class);

    public static void main(String[] args) {
        test3();
    }

    private static void test3() {
        TimerTaskTest task = new TimerTaskTest();

        logger.info("test3 start");
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(task, 0, 1000);
        logger.info("test3 end");
    }

    static class TimerTaskTest extends TimerTask {
        int i = 0;

        @Override
        public void run() {
            logger.info("------------------timer task start");
            if (i % 5 == 0) {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            logger.info("++++++++++++++++++++++++++++++" + i);
            i++;
            logger.info("------------------timer task end");
        }

    }
}

日志如下:

11:09:44.522 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
11:09:47.522 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++0
11:09:47.522 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
11:09:47.522 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
11:09:47.522 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++1
11:09:47.522 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
11:09:47.522 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
11:09:47.522 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++2
11:09:47.522 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
11:09:47.522 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
11:09:47.522 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++3
11:09:47.522 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
11:09:48.524 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
11:09:48.524 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++4
11:09:48.524 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
11:09:49.514 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
11:09:52.529 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++5
11:09:52.529 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
11:09:52.529 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
11:09:52.529 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++6
11:09:52.529 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
11:09:52.529 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
11:09:52.529 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++7
11:09:52.529 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
11:09:52.529 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
11:09:52.529 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++8
11:09:52.529 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
11:09:53.514 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
11:09:53.514 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++9
11:09:53.514 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
11:09:54.513 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
11:09:57.523 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++10
11:09:57.523 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
11:09:57.523 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task start
11:09:57.523 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ++++++++++++++++++++++++++++++11
11:09:57.523 [Timer-0] INFO com.massmeet.mytimer.service.MyTimerTask - ------------------timer task end
scheduleAtFixedRate在任务执行超时后,不错period等待,立即执行下一个任务。并且后续任务会根据超时时长,不做period等待,立即执行后续的任务,直到追上设定的节奏后,再进行period等待执行后续任务。

即:scheduleAtFixedRate侧重的是频率的稳定,如果错过了,就取消period等待,努力追上设定好的节奏。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值