java 函数睡眠10秒,Windows 10上的Java Thread.sleep()在S3睡眠状态下停止

有一个桌面应用程序使用Thread.sleep()来实现长(几分钟或几小时)延迟.这个应用程序从Windows XP到(至少)Windows 7都运行良好.应用程序计算未来需要做多少事情,然后点击Thread.sleep(msToWait).即使系统在等待期间恰好进入S3睡眠状态,这一直工作正常.

但是,从Windows 10开始,如果机器已经在S3中,则Thread.sleep()之后的代码不会“按时”执行.似乎机器开始执行代码“msToWait”加上机器进入S3的时间(现在不是100%肯定,但很可能).

早期版本的Windows没有表现出这种行为; Thread.sleep()之后的代码等待了适当的时间,而不管睡眠状态如何.

测试已在当前的JVM 1.7上进行.

这是Windows 10的错误吗?这是一个JVM错误吗?有解决方法吗?

附加数据:

开发了测试程序和程序.程序是运行程序,使机器休眠约一分钟,然后唤醒机器并等待程序完成.

如果这个程序在JVM版本:25.40-b25的Windows 10(报告为8)上运行,则会失败:

C:\Users\Tester\Downloads>SleepTester.exe

Wed Apr 01 10:47:35 PDT 2015 Using default number of minutes: 5

Wed Apr 01 10:47:35 PDT 2015 You can use "SleepTester -minutes 10" to have it sleep for 10 minutes, for example.

Wed Apr 01 10:47:35 PDT 2015 JVM Version: 25.40-b25 Windows Version: Windows 8

Wed Apr 01 10:47:35 PDT 2015 The program will now wait for 5 minutes. Expect wrap-up at Wed Apr 01 10:52:35 PDT 2015

Wed Apr 01 10:53:38 PDT 2015 The system has come through the Thread.sleep(300000).

Wed Apr 01 10:53:38 PDT 2015 This should be a low number: 63589

Wed Apr 01 10:53:38 PDT 2015 This appears to be operating incorrectly...the expected sleep time has NOT been achieved.

Wed Apr 01 10:53:38 PDT 2015 Program is ending.

如果该进程在Windows 7上运行,则不会失败.

Wed Apr 01 17:12:18 EDT 2015 Java Runtime Version: 1.8.0_31-b13 JVM Version: 25.31-b07 Windows Version: Windows 7

Wed Apr 01 17:12:18 EDT 2015 The program will now wait for 6 minutes. Expect wrap-up at Wed Apr 01 17:18:18 EDT 2015

Wed Apr 01 17:18:18 EDT 2015 The system has come through the Thread.sleep(360000).

Wed Apr 01 17:18:18 EDT 2015 This should be a low number: 0

Wed Apr 01 17:18:18 EDT 2015 Program is ending.

这是测试程序:

import java.util.Date;

public class SleepTester {

private static int mMinutes;

private static int mDefault = 5;

public static void main(String[] args) throws Exception {

for (int iArg = 0; iArg < args.length; ++iArg) {

if (args[iArg].equals("-minutes") && (iArg + 1) < args.length) {

mMinutes = Integer.parseInt(args[++iArg]);

}

}

if (mMinutes == 0) {

mMinutes = mDefault;

System.out.println(new Date() + " Using default number of minutes: " + mDefault);

System.out.println(new Date() + " You can use \"SleepTester -minutes 10\" to have it sleep for 10 minutes, for example.");

}

System.out.println(new Date() + " Java Runtime Version: " + System.getProperty("java.runtime.version") + " JVM Version: " + System.getProperty("java.vm.version") + " Windows Version: " + System.getProperty("os.name"));

long msDelay = mMinutes * 60 * 1000;

long wakePoint = new Date().getTime() + msDelay;

System.out.println(new Date() + " The program will now wait for " + mMinutes + " minutes. Expect wrap-up at " + new Date(wakePoint));

Thread.sleep(msDelay); // If the machine goes into S3 during this interval, it should not matter, as long as it's awake when it fires.

System.out.println(new Date() + " The system has come through the Thread.sleep(" + msDelay + "). ");

long msAccuracy = Math.abs(new Date().getTime() - wakePoint);

System.out.println(new Date() + " This should be a low number: " + msAccuracy);

if (msAccuracy > 1000) System.out.println(new Date() + " This appears to be operating incorrectly...the expected sleep time has NOT been achieved.");

System.out.println(new Date() + " Program is ending.");

}

}

我意识到我可以尝试各种其他方法来睡觉,但我认为,因为我经历并记录了这一点,我会在尝试其他事情之前在此发布.

附加信息:此故障似乎也出现在Windows 8中(但不是7或更早).

解决方法:

这是预期的有效行为. documentation是非常明确的,说明:

these sleep times are not guaranteed to be precise, because they are limited by the facilities provided by the underlying OS.

和:

In any case, you cannot assume that invoking sleep will suspend the thread for precisely the time period specified.

标签:java,windows,windows-8,windows-10,sleep-mode

来源: https://codeday.me/bug/20190702/1360831.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值