Без опроса, есть ли способ для другого потока «сбросить» таймер спящего потока, заставляя его дольше спать?
Если вы говорите о Thread.sleep
, тогда выхода нет. Если A вызывает Thread.sleep(timeout)
, он не проснется, пока не истечет время ожидания. Вы можете разбудить его раньше, прерывая поток. Но вы не можете сделать так, чтобы не просыпался до тех пор, пока не будет позже.
Вы могли бы потенциально уменьшить количество нежелательных пробуждений потока с помощью использования wait / notify и реализации единый поток "менеджер сна" для выполнения уведомлений. Менеджер может использовать время ожидания или сна, чтобы дождаться следующего, что ему нужно сделать.
Предостережения:
В вашем сценарии он может проснуться и найти что ему ничего не нужно делать.
Если вы хотите, чтобы рабочий поток проснулся на раньше , чем планировалось изначально, вам может потребоваться прервать спящий менеджер темы. Или просто прервите рабочий поток напрямую.
Если вы используете прерывания, подобные этому, вы должны быть уверены, что они не мешают (потенциально) другому использованию прерываний. Это добавляет сложности.
Стоит ли сложность? (IMO), только если вам нужно часто менять время пробуждения.
В вашем сценарии простой подход состоит в том, чтобы просто позволить активизироваться и вернуть рабочий поток go в спящий режим с обновленным временем пробуждения.