Что главное различие между 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);
они печатают точно в одно и то же время, кажется, они выполняются с точно таким же интервалом.
Визуализируйте временной ряд
scheduleAtFixedRate
метода вызова . Следующие казни начнутся немедленно, если последнее длится дольше периода. В противном случае он начнется по истечении определенного периода времени.Временной ряд
scheduleWithFixedDelay
метода вызова . Следующее выполнение начнется по истечении времени задержки между завершением одного выполнения и началом следующего, независимо от времени его выполнения.Надеюсь помочь тебе
источник
scheduleAtFixedRate()
Метод создает новую задачу и передает его исполнителю за каждый период, независимо от того , или не закончили предыдущее задание .С другой стороны,
scheduleWithFixedDelay()
метод создает новую задачу после завершения предыдущей .источник
scheduleAtFixedRate
:)Если вы прочитаете Java Doc, будет понятнее
ScheduledFuture scheduleAtFixedRate (Runnable command, long initialDelay, long period, TimeUnit unit) Создает и выполняет периодическое действие, которое активируется сначала после заданной начальной задержки, а затем с заданным периодом; то есть выполнение начнется после initialDelay, затем initialDelay + period, затем initialDelay + 2 * period и так далее.
ScheduledFuture scheduleWithFixedDelay (Runnable command, long initialDelay, long delay, TimeUnit unit) Создает и выполняет периодическое действие, которое активируется сначала после заданной начальной задержки, а затем с заданной задержкой между завершением одного выполнения и началом следующего.
источник
В scheduleAtFixedRate есть одна загвоздка, если первый поток занимает слишком много времени и не завершился в течение заданного времени, тогда второй последовательный поток не запустится, как только первая задача будет завершена, и не будет немедленно запущен, пока первый поток завершил свою задачу и продолжительность gievn истекло. JVM решит, когда будет выполнена следующая задача.
Думаю, это поможет вам выбрать метод Becuase, в связи с чем у меня возникла большая проблема
источник
ScheduledThreadPoolExecutor
(и последний имеет четко определенное поведение)Напишем простую программу:
И посмотрите результаты:
ВНИМАНИЕ, время выполнения больше, чем ожидание
scheduleWithFixedDelay сохраняет задержку
scheduleAtFixedRate удаляет задержку
источник
Просто выполните его, и вы почувствуете разницу. Спасибо
источник