等待和阻止线程状态之间的区别

2022-08-31 08:18:35

线程状态 WAIT 和线程状态 BLOCKED 有什么区别?

Thread.State 文档

已阻止
等待监视器锁定被阻止的线程处于此状态。

正在等待
无限期等待另一个线程执行特定操作的线程处于此状态

没有向我解释区别。


答案 1

线程在调用对象后进入等待状态。这称为等待状态。一旦线程达到等待状态,它将需要等到其他一些线程调用或对象上。wait()notify()notifyAll()

通知此线程后,它将不可运行。可能是其他线程也收到通知(使用 ),或者第一个线程尚未完成其工作,因此它仍然被阻止,直到它有机会。这称为“阻止状态”。每当线程尝试获取对象上的锁定,并且其他线程已持有锁定时,就会发生“已阻止”状态。notifyAll()

一旦其他线程离开并且它的这个线程机会,它移动到Runnable状态之后,它有资格基于JVM线程机制拾取工作并移动到运行状态。


答案 2

区别相对简单。

在状态下,线程即将进入块,但当前在同一对象上的块内运行另一个线程。然后,第一个线程必须等待第二个线程退出其块。BLOCKEDsynchronizedsynchronized

在状态下,一个线程正在等待来自另一个线程的信号。这通常通过调用 或 来发生。然后,该线程将保持此状态,直到另一个线程调用或死亡。WAITINGObject.wait()Thread.join()Object.notify()