Как Java рассчитывает время сна, когда компьютер переходит в режим гибернации? - PullRequest
0 голосов
/ 18 октября 2018

Я написал программу на Java, которая выполняет некоторую функцию и, как ожидается, будет спать в течение 12 часов (через TimeUnit.HOURS.sleep(12)), а затем продолжит выполнение другой функции.

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

Однако сейчас прошло более 12 часов с того момента, как был вызван исходный код TimeUnit.HOURS.sleep(12) и код (т. Е. Вторая функция) не выполнено.

Значит ли это, что теперь мне придется ждать еще 12 часов (начиная с того момента, когда я разбудил ноутбук), прежде чем он выполнит желаемый код?(Я не могу остановить свою программу прямо сейчас, чтобы проверить это, потому что я гарантирую, что моя функция не будет выполняться даже после дополнительных 12 часов, поскольку она зависит от вывода первой функции, которая опирается на данные в реальном времени) *

Я обнаружил аналогичную тему в SO, связанную с C, но ничего о Java.

Основываясь на одном потоке, который я читаю, программа сравнивает две метки времени при определении времени ожидания, но, конечно, это не может быть так, иначе мой кодвыполнили уже.Так как же работает thread.sleep() под капотом?

Спасибо

1 Ответ

0 голосов
/ 18 октября 2018

Thread.sleep реализация, очевидно, зависит от платформы.

HotSpot JVM вызывает WaitForMultipleObjects в Windows и pthread_cond_timedwait с CLOCK_MONOTONIC во всех операционных системах POSIXсистемы.Ни Windows, ни Linux API не учитывают время, когда система приостановлена.

В основном Thread.sleep никогда не был рассчитан на работу в спящем режиме.Для получения дополнительной информации см. Обсуждение JDK-8146730 и JDK-8146527 .

...