Mor*_*ive 94 java multithreading block wait
线程状态WAIT和线程状态BLOCKED之间有什么区别?
已
阻止等待监视器锁定的线程处于此状态.正在
等待另一个线程无限期地执行特定操作的线程处于此状态
没有解释给我的区别.
Fla*_*vio 84
差异相对简单.
在该BLOCKED状态中,线程即将进入synchronized块,但是当前synchronized在同一对象的块内运行另一个线程.然后第一个线程必须等待第二个线程退出其块.
在该WAITING状态中,线程正在等待来自另一个线程的信号.这通常通过调用Object.wait()或发生Thread.join().然后线程将保持此状态,直到另一个线程调用Object.notify()或死亡.
Ank*_*sal 72
一旦调用wait()了Object,线程就会进入等待状态.这称为等待国.一旦线程到达等待状态,它将需要等待一些其他线程notify()或notifyAll()对象.
一旦通知此线程,它将无法运行.可能是其他线程也被通知(使用notifyAll())或第一个线程尚未完成其工作,因此它仍然被阻塞,直到它有机会.这称为阻塞状态.
一旦其他线程离开并且这个线程有机会,它就会移动到Runnable状态,之后它就是基于JVM线程机制的合格拾取工作并转移到运行状态.
Nat*_*hes 17
阻塞和等待状态之间的重要区别是对调度程序的影响.处于阻塞状态的线程是争用锁定的waitset的一部分; 该线程仍然算作调度程序需要服务的东西,可能会考虑到调度程序决定给出运行线程的时间.
一旦线程处于等待状态,它对系统施加的压力就会最小化,并且调度程序不必担心它.它会一直处于休眠状态,直到收到通知为止.除了它保持OS线程占用的事实之外,它完全没有用.
这就是为什么使用notifyAll不太理想,它会导致一堆以前很高兴休眠的线程在系统上没有负载被唤醒,其中大多数线程将阻塞,直到他们可以获得锁定,找到它们的条件等待不是真的,回去等待.最好只通知那些有可能取得进展的线程.
(使用ReentrantLock而不是内部锁定允许您为一个锁定具有多个条件,以便您可以确保通知的线程是在等待特定条件的线程,避免在线程获得通知的情况下丢失通知错误它无法作用的东西.)
小智 14
解释线程转储的简化透视图:
| 归档时间: |
|
| 查看次数: |
59789 次 |
| 最近记录: |