javascheduled-tasksscheduledexecutorservice

scheduleAtFixedRate vs scheduleWithFixedDelay


What's the main difference between scheduleAtFixedRate and scheduleWithFixedDelay methods of ScheduledExecutorService?

scheduler.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        System.out.println("scheduleAtFixedRate:    " + new Date());
    }
}, 1, 3L , SECONDS);

scheduler.scheduleWithFixedDelay(new Runnable() {
    @Override
    public void run() {
        System.out.println("scheduleWithFixedDelay: " + new Date());
    }
}, 1, 3L , SECONDS);

they print exact the same time, seems they are executed at exact the same interval.


Solution

  • Try adding a Thread.sleep(1000); call within your run() method... Basically it's the difference between scheduling something based on when the previous execution ends and when it (logically) starts.

    For example, suppose I schedule an alarm to go off with a fixed rate of once an hour, and every time it goes off, I have a cup of coffee, which takes 10 minutes. Suppose that starts at midnight, I'd have:

    00:00: Start making coffee
    00:10: Finish making coffee
    01:00: Start making coffee
    01:10: Finish making coffee
    02:00: Start making coffee
    02:10: Finish making coffee
    

    If I schedule with a fixed delay of one hour, I'd have:

    00:00: Start making coffee
    00:10: Finish making coffee
    01:10: Start making coffee
    01:20: Finish making coffee
    02:20: Start making coffee
    02:30: Finish making coffee
    

    Which one you want depends on your task.