【问题标题】:Thread sleep is inconsistance in android线程睡眠在android中不一致
【发布时间】:2013-12-22 11:28:34
【问题描述】:

我发现了关于 Thread.sleep 的令人惊讶的事情。线程没有及时唤醒。让我解释。我创建一个活动(无服务)并运行如下线程。

Thread.sleep(50000); // 50 seconds
System.out.println("something");

然后我将活动保持在前台并关闭显示(通过按电源按钮)。我还登录了保存在 sdcard 中的文件。我发现,几乎 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)

【问题讨论】:

  • 您在活动代码的哪个位置调用睡眠?
  • @Zymurgeek 这很复杂。但是你可以假设一个简单的线程在 onCreate() 中运行。还有3个等待线程并行运行。但它们是独立的。

标签: java android multithreading


【解决方案1】:

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

您可以相信它会按照指定的方式运行1。但是规范说睡眠会导致线程停止至少毫秒。在某些情况下,它可能会停止更长时间。例如,如果较高优先级的线程有很多工作要做,那么较低优先级的线程可能很长时间都无法从睡眠中唤醒。


1 - 实际上,理论上,它可能不会按照指定的方式运行。但是你没有提供任何证据来支持这一点......

【讨论】:

  • 是否可以在Java中制作一个线程sleep的准确时间?
  • 除非您在实时操作系统平台上使用实时 Java,否则不会。
  • 睡眠在这里是错误的选择。如果您想要准确,请使用计时器。
  • 有没有android设备在一段时间后进入睡眠状态的情况?因为它发生在android设备中。我实际上不需要更高的时间效率。不到 1 秒的额外延迟是可以忍受的。
  • 尝试使用Timer。但我怀疑如果Thread.sleep 出现无法解释的大停顿,那么Timer 也会出现。
【解决方案2】:

你可以试试:

LockSupport.parkNanos(nanos)

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

【讨论】:

  • 我刚刚创建了一个小测试用例,我在其中循环执行 Thread.sleep(1) 并使用 System.nanoTime 来检查调用 Thread.sleep 时实际经过了多少时间。这从超过 1 毫秒或超过 5 毫秒不等。不幸的是,用 LockSupport.parkNanos 替换 Thread.sleep 产生了相同的结果。所以对我来说,LockSupport.parkNanos 似乎和 Thread.sleep 一样不准确。是否有任何文档表明 LockSupport.parkNanos 在准确性方面更好?
【解决方案3】:

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

More details

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 2011-09-23
    • 2017-05-09
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多