我已经阅读了很多关于线程状态的文档,其中一些文档告诉我有两种不同的状态:阻塞(在同步之前)和等待(如果调用等待),其他一些状态告诉我们只有一种状态:等待。此外,一些文档告诉你应该为每个wait()调用notify(),如果不这样做,那么即使监视器被解锁,线程waiting()也永远不会被执行。
答案 0 :(得分:13)
从上一句话开始,我发现您并未完全理解synchronized
和wait()
/ notify()
之间的区别。
基本上,监视器具有锁定和条件。这几乎是正交概念。
当线程进入synchronized
块时,它会获得一个锁。当线程离开时,它会释放一个锁。只有一个线程可以锁定特定的监视器。
当具有锁定的线程调用wait()
时,它会释放锁定并开始等待其状态。当具有锁的线程调用notify()
时,等待条件的其中一个线程(在notifyAll()
的情况下的所有线程)都有资格执行(并开始等待获取锁,因为通知线程仍然有它)。
因此,等待获取锁(Thread.State.BLOCKED)并等待监视器的条件(Thread.State.WAITING)是不同且独立的状态。
如果你看一下Lock
类,这个行为会更清楚 - 它实现了与synchronized
块相同的同步原语(带有一些扩展),但是在锁和条件之间提供了明确的区别。
答案 1 :(得分:1)
线程调用
Object.wait
时 方法,它释放这个获得 监视并放入WAITING
(或 如果我们调用超时,则TIMED_WAITING
等待方法的版本)状态。 现在,当线程被通知时notify()
或notifyAll()
致电 同一个对象然后是等待状态 线程结束和线程 开始试图重获所有 它在监控中获得的监控器 等待时间。曾经有一次 可能是几个线程试图 重获(或者可能获得第一个 时间)他们的监视器。如果不止一个 线程尝试获取监视器 然后只有一个特定对象 线程(由JVM
调度程序选择) 被授予监视器和所有其他 线程被置于BLOCKED
状态。
答案 2 :(得分:1)
有two different states阻止和等待。
如果没有人通知(或打断)你是真的,那么关于永远等待的部分。
答案 3 :(得分:0)
在Java的角度(Thread.State)中,有两种不同的状态:BLOCKED和WAITING。当线程在Object上同步时,它处于BLOCKED状态。线程执行wait后,它处于WAITING状态。
在Linux平台上,Java线程是OS本机线程。 BLOCKED和WAITING状态的OS线程状态是可中断睡眠。使用ps检查时,BLOCKED和WAITING线程的状态为“Sl +”。