前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >理解ScheduledExecutorService中scheduleAtFixedRate和scheduleWithFixedDelay的区别

理解ScheduledExecutorService中scheduleAtFixedRate和scheduleWithFixedDelay的区别

作者头像
xiaoxi666
发布2019-05-10 15:00:21
3.7K0
发布2019-05-10 15:00:21
举报

scheduleAtFixedRate

每间隔一段时间执行,分为两种情况:

/**
 * 任务执行时间(8s)小于间隔时间(10s)
 */
public class ScheduleTest {
    static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    public static void main(String[] args) {
        scheduler.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println("Start: scheduleAtFixedRate:    " + new Date());
                try {
                    Thread.sleep(8000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("End  : scheduleAtFixedRate:    " + new Date());
            }
        }, 0, 10 , SECONDS);
    }
}

output:

Start: scheduleAtFixedRate:    Sun Apr 28 14:36:00 CST 2019
End  : scheduleAtFixedRate:    Sun Apr 28 14:36:08 CST 2019
Start: scheduleAtFixedRate:    Sun Apr 28 14:36:10 CST 2019
End  : scheduleAtFixedRate:    Sun Apr 28 14:36:18 CST 2019
Start: scheduleAtFixedRate:    Sun Apr 28 14:36:20 CST 2019
End  : scheduleAtFixedRate:    Sun Apr 28 14:36:28 CST 2019
Start: scheduleAtFixedRate:    Sun Apr 28 14:36:30 CST 2019
End  : scheduleAtFixedRate:    Sun Apr 28 14:36:38 CST 2019
...

程序启动时间是14:36:00,以后每间隔10s执行一次(即14:36:10、14:36:20、14:36:30等)。

当前任务执行时间大于等于间隔时间,任务执行后立即执行下一次任务。相当于连续执行了。

/**
 * 任务执行时间(12s)大于间隔时间(10s)
 */
public class ScheduleTest {
    static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    public static void main(String[] args) {
        scheduler.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println("Start: scheduleAtFixedRate:    " + new Date());
                try {
                    Thread.sleep(12000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("End  : scheduleAtFixedRate:    " + new Date());
            }
        }, 0, 10 , SECONDS);
    }
}

output:

Start: scheduleAtFixedRate:    Sun Apr 28 14:30:13 CST 2019
End  : scheduleAtFixedRate:    Sun Apr 28 14:30:25 CST 2019
Start: scheduleAtFixedRate:    Sun Apr 28 14:30:25 CST 2019
End  : scheduleAtFixedRate:    Sun Apr 28 14:30:37 CST 2019
Start: scheduleAtFixedRate:    Sun Apr 28 14:30:37 CST 2019
End  : scheduleAtFixedRate:    Sun Apr 28 14:30:49 CST 2019
Start: scheduleAtFixedRate:    Sun Apr 28 14:30:49 CST 2019
End  : scheduleAtFixedRate:    Sun Apr 28 14:31:01 CST 2019

程序启动时间是14:30:13,按理说应该每间隔10s执行一次(即14:30:23、14:30:33等),但由于任务执行时间长于10s,下一次的任务要开始的时候发现上次的任务还没有完成,因此阻塞等待,一旦发现上次的任务完成,就马上启动。表现出来就是任务延时启动,最终的效果就是连续执行。

scheduleWithFixedDelay

每当上次任务执行完毕后,间隔一段时间执行。不管当前任务执行时间大于、等于还是小于间隔时间,执行效果都是一样的。

/**
 * 任务执行时间(8s)小于间隔时间(10s)
 */
public class ScheduleTest {
    static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    public static void main(String[] args) {
        scheduler.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                System.out.println("Start: scheduleWithFixedDelay: " + new Date());
                try {
                    Thread.sleep(12000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("End  : scheduleWithFixedDelay: " + new Date());
            }
        }, 0, 10 , SECONDS);
    }
}

output:

Start: scheduleWithFixedDelay: Sun Apr 28 14:27:59 CST 2019
End  : scheduleWithFixedDelay: Sun Apr 28 14:28:07 CST 2019
Start: scheduleWithFixedDelay: Sun Apr 28 14:28:17 CST 2019
End  : scheduleWithFixedDelay: Sun Apr 28 14:28:25 CST 2019
Start: scheduleWithFixedDelay: Sun Apr 28 14:28:35 CST 2019
End  : scheduleWithFixedDelay: Sun Apr 28 14:28:43 CST 2019
Start: scheduleWithFixedDelay: Sun Apr 28 14:28:53 CST 2019
End  : scheduleWithFixedDelay: Sun Apr 28 14:29:01 CST 2019
...

可以看出每个End后,等待了10秒,才启动下一次Start。
/**
 * 任务执行时间(12s)大于间隔时间(10s)
 */
public class ScheduleTest {
    static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    public static void main(String[] args) {
        scheduler.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                System.out.println("Start: scheduleWithFixedDelay: " + new Date());
                try {
                    Thread.sleep(12000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("End  : scheduleWithFixedDelay: " + new Date());
            }
        }, 0, 10 , SECONDS);
    }
}

output:

Start: scheduleWithFixedDelay: Sun Apr 28 14:26:29 CST 2019
End  : scheduleWithFixedDelay: Sun Apr 28 14:26:41 CST 2019
Start: scheduleWithFixedDelay: Sun Apr 28 14:26:51 CST 2019
End  : scheduleWithFixedDelay: Sun Apr 28 14:27:03 CST 2019
Start: scheduleWithFixedDelay: Sun Apr 28 14:27:13 CST 2019
End  : scheduleWithFixedDelay: Sun Apr 28 14:27:25 CST 2019
Start: scheduleWithFixedDelay: Sun Apr 28 14:27:35 CST 2019
End  : scheduleWithFixedDelay: Sun Apr 28 14:27:47 CST 2019
...

可以看出每个End后,等待了10秒,才启动下一次Start。

参考

scheduleAtFixedRate vs scheduleWithFixedDelay

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-04-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • scheduleAtFixedRate
  • scheduleWithFixedDelay
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档