我发现了一些关于Thread.sleep的令人惊讶的事情。线程没有及时唤醒。让我解释。我创建一个活动(没有服务)并运行如下的线程。
Thread.sleep(50000); // 50 seconds
System.out.println("something");
然后我将活动保持在前景并关闭显示屏(按电源按钮)。此外,我正在登录保存在SD卡中的文件。我发现,经过近10分钟线程延迟7.35分钟打印而不是50秒。这是正常的吗?我可以信任Thread.sleep()吗?
16:47:57 ---- START
--------
-------- (all are in time)
--------
16:57:07 -- (in time)
16:57:57 -- (in time)
17:05:38 --- (late)
答案 0 :(得分:2)
我可以信任Thread.sleep()吗?
您可以信任它的行为符合指定 1 。但是规范说睡眠会导致线程停止至少那个毫秒。在某些情况下,它可能会停止更长时间。例如,如果要为更高优先级的线程做很多工作,那么较低优先级的线程可能不会长时间从睡眠中唤醒。
1 - 实际上,从理论上讲,可能的行为与指定的一样。但你没有提供任何证据支持......
答案 1 :(得分:1)
您可以尝试:
LockSupport.parkNanos(nanos)
或其提供的其他方法。它更准确。
答案 2 :(得分:1)
我发现当你使用电源按钮关闭屏幕时,android有时会进入睡眠状态。屏幕关闭时CPU也会进入睡眠状态。那是乳清Thread.sleep()给予大的延迟。在我的情况下,我的设备处于睡眠模式7.30
分钟,当我打开屏幕时cpu
唤醒并再次启动线程。通过获取Partial_wake_lock,您可以按cpu
进入睡眠状态,即使按下电源按钮(不关机)也是如此。