【问题标题】:java - What happens to threads that are sleeping if the OS gets suspended?java - 如果操作系统被挂起,正在休眠的线程会发生什么?
【发布时间】:2018-06-04 03:56:37
【问题描述】:

如果我启动一个线程:

 new Thread(() -> {
        while (running) {
            try {
                Thread.sleep(TimeUnit.MINUTES.toMillis(30));
                /* ... */
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
 }).start();

如果操作系统被挂起(睡眠模式等),线程会发生什么 而 Thread.sleep() 处于活动状态?当操作系统退出睡眠时,线程是否恢复正常睡眠?

我使用的是 Windows 10。

【问题讨论】:

  • 我怀疑它可以计算它应该唤醒的时间,并在您启动时或之后立即唤醒,但它很可能取决于操作系统。

标签: java multithreading


【解决方案1】:

在这种情况下,当系统进入睡眠模式时,您的线程也将进入睡眠模式。当然,进入睡眠状态的电脑比你启动的线程具有更高的命令权限。此睡眠与您启动的睡眠不同。简而言之,操作系统会创建正在运行的进程的快照并在唤醒时将其恢复。

当 PC 休眠时,它实际上会冻结所有内容,您的线程也是如此。如果它在睡眠 5 分钟时停止,它会在醒来时从那里继续(即使睡眠持续时间更长)。

回想一下,特定线程的睡眠时间(在您的情况下为 30 分钟)在特定应用程序的上下文中是有意义的。这意味着应用程序的其他部分正在计算您的线程将恰好休眠 30 分钟这一事实。如果不是这样,那就是如果你的线程继续睡眠 30 分钟,即使 PC 处于睡眠模式,这意味着你的进程必须仍在运行,这与 sleep 的目的相矛盾.

【讨论】:

    【解决方案2】:

    当系统在 Windows 中进入睡眠模式时;拍摄系统快照,这意味着保存所有程序的状态。在此示例中,假设 Windows 在调用 Thread.sleep 5 秒后进入睡眠模式。 Thread.sleep 在第 6 秒。 1 小时后,Windows 再次打开并从之前的快照恢复。这意味着 Thread.sleep 从第 6 秒开始继续。

    【讨论】:

      猜你喜欢
      • 2011-06-24
      • 2011-01-18
      • 2011-01-22
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 2014-01-02
      • 1970-01-01
      • 2011-05-24
      相关资源
      最近更新 更多