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 80

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

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

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

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

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

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

Если вы читали документации, так понятнее будет.

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

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