【问题标题】:What state is a sleeping thread in?休眠线程处于什么状态?
【发布时间】:2014-11-17 07:39:29
【问题描述】:

我正在寻找以下方面的验证/论据:

在任何时间点,一个线程都恰好位于 5 个(+1 -- 2 表示WAITINGstates 之一。

假设一个线程T调用

线程.sleep(3000);

并因此使自己进入睡眠状态 3 秒。

在这 3 秒内它处于哪种状态?

它显然是start()-ed 并且还活着,因此既不是NEW 也不是TERMINATED

它没有等待任何锁。事实上,它还没有释放它在这次调用之前的任何锁,所以它不是BLOCKED

它没有在另一个线程上等待。在某种意义上是在等待自己——但这不是WAITING 状态的规范。使线程进入WAITING 状态的是以下调用之一:Object.wait()Thread.join()LockSupport.park()

所以它应该是RUNNABLE——线程状态中唯一遗漏的一个。 但是,RUNNABLE 是线程在 JVM 上执行的状态——启用 CPU 时间并因此消耗资源。 处于 CPU 计划中的睡眠线程似乎是矛盾的。

我有什么遗漏吗?

TIA。

【问题讨论】:

  • 它被阻塞了,它正在等待操作系统唤醒它以进行 I/O。
  • 关于“RUNNABLE 是线程在 JVM 上执行的状态”,当您谈论 Java 库的 Thread.getState() 时是这样,但以防万一您感兴趣;在许多操作系统的命名法中,“可运行”意味着线程“运行”,因为它正在等待可用的 CPU 运行。

标签: java multithreading concurrency


【解决方案1】:

Thead.State.TIMED_WAITING reads 的 Javadoc:

具有指定等待时间的等待线程的线程状态。线程由于调用以下方法之一并具有指定的正等待时间而处于定时等待状态:

  • Thread.sleep
  • Object.wait 超时
  • Thread.join 超时
  • LockSupport.parkNanos
  • LockSupport.parkUntil

事实上,以下测试程序会打印 TIMED_WAITING:

public class Test {
    public static void main(String[] args) throws Exception {
        Thread t = new Thread() {
            public void run() {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            };
        };
        t.start();
        Thread.sleep(100); // make sure the other thread has started
        System.out.println(t.getState());
    }
}

【讨论】:

  • 感谢有用的答案。仅读取 WAITING - 一直在 TIMED_WAITING 上传递。
  • 完全相似的事情发生在我身上,这让我想到了这个问题。
猜你喜欢
  • 1970-01-01
  • 2011-07-17
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
  • 2015-10-09
  • 2020-04-30
  • 1970-01-01
相关资源
最近更新 更多