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
метод. Следующее выполнение начнется немедленно, если последнее займет больше времени, чем период. В противном случае, он начнет через время.временной ряд вызова
scheduleWithFixedDelay
метод. Следующее исполнение начнется после времени задержки между завершением одного исполнения и началом следующего, независимо от времени его выполненияНадежда может помочь вам
есть один улов в 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 / единицы) Создает и выполняет периодическое действие, которое будет активировано после данной начальной задержки, а затем с заданной задержкой между окончанием одного выполнения и началом следующего.