Java线程的WAITING状态和BLOCKED状态之间区别的一点理解

发布时间 2023-06-28 10:08:22作者: rockdow

先说结论:WAITING状态是线程在获取锁对象之后,由于某些原因需要等待一些事件的完成才能继续执行,这时线程调用Object.wait()、Thread.sleep()、Thread.join()等方法进入WAITING状态。而BLOCKED状态则是线程在准备进入某个同步代码块时,发现锁对象已经被其它线程占用了,这时线程就会进入BLOCKED状态。

接下来是一些注意点:

  • wait和notify方法要在同步块中调用(防止wait的线程没有接收到其他线程发送的notify消息),wait会释放锁,但notify方法并不会真正释放锁,必须等到它所在的同步代码块执行完毕才能完成锁对象的释放。

  • sleep方法不必在同步块中调用,而且sleep方法不会释放锁。(个人理解,sleep方法需要时间参数,到达指定时间后线程自动苏醒,所以不需要类似wait那样的严格要求)
  • join方法底层使用wait方法,并且join方法本身就是同步方法(锁对象是调用join方法的线程本身),所以和sleep一样不必在同步块调用,并且jvm在关闭线程之前会检测线阻塞在线程锁对象上的其它线程,然后执行notfyAll(),这样就实现了唤醒阻塞线程的功能 。