当电脑进入休眠模式时,Java如何计算睡眠时间?

4
我写了一个Java程序,执行一些函数后需要睡眠12小时(通过TimeUnit.HOURS.sleep(12)),然后继续执行另一个函数。
昨晚我不小心让我的笔记本电脑处于未连接电源的状态下,并进入了休眠模式。今天早上我从休眠模式中唤醒计算机,我的程序像之前一样运行。
然而,现在已经超过了12个小时,但第二个函数的代码没有执行。
这是否意味着我现在必须再等待12个小时(从我唤醒笔记本电脑开始)才能执行我的期望代码?(我现在无法停止我的程序来测试这一点,因为这将保证我的函数即使在额外的12个小时后也无法执行,因为它依赖于第一个函数的输出,而第一个函数依赖于实时数据)
我在SO上找到了一个关于C的类似主题,但没有关于Java的内容。
根据我读到的一个线程,程序在确定睡眠时间时会比较两个时间戳,但肯定不是这种情况,否则我的代码已经执行了。那么thread.sleep()在底层是如何工作的呢?
谢谢

理论上,休眠会冻结磁盘、内存和处理器的状态,并将其安全保存。这意味着,一旦您从休眠状态返回并打开笔记本电脑,它会恢复到您离开时的状态,期间没有任何进程或线程在后台运行。 - Arihant Bansal
1个回答

3

Thread.sleep的实现显然取决于平台。

HotSpot JVM在Windows上调用WaitForMultipleObjects,在所有POSIX操作系统上使用带有CLOCK_MONOTONICpthread_cond_timedwait。无论是Windows还是Linux API,在系统暂停时都不计算时间。

基本上,Thread.sleep从来没有设计用于跨休眠工作。有关更多信息,请参见JDK-8146730JDK-8146527的讨论。


我会尝试重复睡眠1分钟(或更短时间),直到墙钟时间已经到达为止。+1 - Peter Lawrey
我刚在Windows 10上使用Java 1.8.0_202尝试了一下,确实,休眠目标时间被错过了大约需要让PC休眠、等待一段时间并重新唤醒的时间。 - Dreamspace President

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接