线程睡眠在android中是不一致的

时间:2013-12-22 11:28:34

标签: java android multithreading

我发现了一些关于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)

3 个答案:

答案 0 :(得分:2)

  

我可以信任Thread.sleep()吗?

您可以信任它的行为符合指定 1 。但是规范说睡眠会导致线程停止至少那个毫秒。在某些情况下,它可能会停止更长时间。例如,如果要为更高优先级的线程做很多工作,那么较低优先级的线程可能不会长时间从睡眠中唤醒。


1 - 实际上,从理论上讲,可能的行为与指定的一样。但你没有提供任何证据支持......

答案 1 :(得分:1)

您可以尝试:

LockSupport.parkNanos(nanos)

或其提供的其他方法。它更准确。

答案 2 :(得分:1)

我发现当你使用电源按钮关闭屏幕时,android有时会进入睡眠状态。屏幕关闭时CPU也会进入睡眠状态。那是乳清Thread.sleep()给予大的延迟。在我的情况下,我的设备处于睡眠模式7.30分钟,当我打开屏幕时cpu唤醒并再次启动线程。通过获取Partial_wake_lock,您可以按cpu进入睡眠状态,即使按下电源按钮(不关机)也是如此。

More details