Задача ScheduledExecutorService, которая блокируется дольше, чем ее интервал выполнения - PullRequest
0 голосов
/ 12 февраля 2019

Вопрос о ScheduledExecutorService.shceduleAtFixedRate - я планирую taskA запускать каждые 500 миллисекунд, что блокирует 1000 миллисекунд.Теперь последующие казни не будут ждать дополнительных 500 миллисекунд, а начнутся сразу же после предыдущего.

taskA получает внутреннюю блокировку, которая также (попытается) приобретается другим потоком.Поскольку внутренние блокировки не имеют справедливости, гарантируют, что этот поток подвергается риску голодания, поэтому вот мой вопрос: существует ли хороший / чистый способ избежать этого риска?Например, запланировать выполнение задачи каждые 1500 миллисекунд (звучит не очень хорошо)?Или мы ожидаем, что приобретение замка продемонстрирует своего рода «амортизированную справедливость»?

1 Ответ

0 голосов
/ 12 февраля 2019

Да, вы можете использовать scheduleWithFixedDelay :

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

Таким образом, заданная вами задержка - это время между окончанием последнего конца и началом следующего - то есть без перекрытия между запусками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...