目标是使当前线程休眠一段时间,范围从几百毫秒到几秒。当显示器打开时,程序正常运行。但是在显示进入睡眠模式后(在MacOS上,显示器可能会在一些系统空闲时间后进入休眠状态),Thread.sleep()将需要更长的时间才能返回。例如,
的Thread.sleep(5000); //睡5秒钟,但实际上需要30秒才能回来。
似乎cpu频率已经缩减,但java jre代码没有遵循这些变化。在MacOS 10.12 + Java 8上测试。
问题:如何制作线程睡眠代码来克服这个问题?
示例代码:两者都不能用于显示睡眠案例。
public static void threadsleep(long milliseconds) {
try {
Thread.sleep(milliseconds);
} catch (InterruptedException ex) {
Logger.getLogger(FetchDailyOptions.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void threadsleep(long milliseconds) {
try {
if (milliseconds < 100) {
Thread.sleep(milliseconds);
return;
}
long targetMilli = System.currentTimeMillis() + milliseconds;
for (;;) {
Thread.sleep(100); // wait 100 milliseconds
if (System.currentTimeMillis() > targetMilli) {
return;
}
}
}
catch (InterruptedException ex) {
Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
}