Java线程状态转换,WAITING到BLOCKED还是RUNNABLE?

raf*_*ian 28 java multithreading thread-state java-threads

SO共识与互联网上几乎每个Java线程状态图之间似乎存在差异; 具体来说,关于 WAITING之后的线程状态转换notify()或被notifyAll()调用...

  • 等待永远不会直接进入RUNNABLE
  • 该线程正在等待直到通知...然后它变为 BLOCKED ...
  • 一旦通知此线程,它将无法运行 ...这 ...阻塞状态.

所以关于SO的共识是:一个线程从调用之后转换WAITING到; 或者; 下图说明了绿色的这种转变.BLOCKEDnotify()notifyAll()

为什么网上的大多数状态图都说明了转换WAITINGRUNNABLE,而不是BLOCKED?红色描绘显示错误的过渡; 我错过了什么吗?

在此输入图像描述

Sot*_*lis 14

任何显示notify将线程从WAITING带到RUNNABLE 的调用的图表都是错误的(或者使用了未明确的快捷方式).一旦线程从一个notify(甚至是虚假的唤醒)中唤醒,它需要重新锁定它正在等待的对象的监视器.这是BLOCKED国家.

线程的线程状态被阻塞等待监视器锁定.处于阻塞状态的线程正在等待监视器锁定以进入同步块/方法或在调用后重新输入同步块/方法Object.wait.

这在javadoc中解释Object#notify():

唤醒的线程将无法继续,直到当前线程放弃对此对象的锁定.

Object#wait()

然后线程等待,直到它可以重新获得监视器的所有权并继续执行.

  • @mystarrocks根据 [`Thread.State` javadoc](http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.State.html#BLOCKED),`WAITING` 用于无参数的`Object#wait`,而`TIMED_WAITING`用于接受等待时间的重载。是的,这对两者都适用。关于“睡眠”,线程不会解锁任何持有的监视器,它在唤醒时仍然拥有它们。 (3认同)