scheduleAtFixedRate vs scheduleWithFixedDelay

В чем основное различие между scheduleAtFixedRate и scheduleWithFixedDelay способы 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);

они печатают точно в то же время, кажется, они выполняются в точно такой же интервал.

5 ответов


попробуйте добавить Thread.sleep(1000); позвоните в свой run() метод... В основном это разница между планированием чего-то, основанного на том, когда предыдущее выполнение заканчивается и когда он (логически) начинается.

например, предположим, что я запланирую будильник, чтобы уйти с фиксированным тариф раз в час, и каждый раз, когда он уходит, у меня есть чашка кофе, которая занимает 10 минут. Предположим, это начнется в полночь. есть:

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

если я планирую с фиксированной задержка из одного часа, я бы:

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

какой из них вы хотите, зависит от вашей задачи.


визуализировать временные ряды вызова scheduleAtFixedRate метод. Следующие казни начнутся немедленно, если последняя займет больше времени. В противном случае он начнется после определенного периода времени.

time series of invocation scheduleAtFixedRate method

временной ряд вызова scheduleWithFixedDelay метод. Следующее исполнение начнется после времени задержки между окончанием одного исполнения и началом следующего, независимо от времени его выполнения

time series of invocation scheduleWithFixedDelay method

Надежда может помочь вам


есть одна загвоздка в класс, если первый поток занимает слишком много времени и не заканчивалась в определенный срок, то второй conscutive нить не начнется как только первая задача будет finsished и не сразу же начать работу, пока первый поток не comepleted их задач и gievn срок уже истек. JVM решит, когда будет выполнена следующая задача .

Я думаю, что это поможет вам выбрать метод, потому что из-за этого у меня большая проблема


метод scheduleAtFixedRate () создает новую задачу и отправляет ее исполнителю каждый период, независимо от того, завершена ли предыдущая задача.

с другой стороны, метод scheduleAtFixedDelay () создает новую задачу после завершения предыдущей задачи.


Если Вы читаете Java Doc, это будет яснее

ScheduledFuture scheduleAtFixedRate (Runnable command, long initialDelay, long period, TimeUnit unit) Создает и выполняет периодическое действие, которое включается сначала после заданной начальной задержки, а затем с заданным периодом; то есть выполнение начнется после initialDelay, затем initialDelay+period, затем initialDelay + 2 * period и так далее.

ScheduledFuture scheduleWithFixedDelay (запускаемая команда, длинный initialDelay, длительная задержка, единица TimeUnit) Создает и выполняет периодическое действие, которое будет активировано после данной начальной задержки, а затем с заданной задержкой между окончанием одного выполнения и началом следующего.