根据Java thread state info调用wait()将导致线程进入BLOCKED状态。但是这段代码将在WAITING状态的Thread中生成(在被调用之后)。
class bThread extends Thread {
public synchronized void run() {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
我有什么不对吗?任何人都可以向我解释这种行为吗? 任何帮助将不胜感激!
答案 0 :(得分:15)
线程正在等待,直到通知为止。然后它变为BLOCKED尝试重新进入同步区域,直到所有其他线程都离开。
您发布的链接中的相关部分(关于等待):
例如,在对象上调用Object.wait()的线程正在等待另一个线程在该对象上调用Object.notify()或Object.notifyAll()。
和(关于BLOCKED):
处于阻塞状态的线程正在等待监视器锁定,以便在调用Object.wait之后重新进入同步块/方法。
当线程尝试从wait()返回时,最后一部分发生,但直到那时才发生。
答案 1 :(得分:9)
监视器一次执行一个线程。假设你有T1-T10线程,9个是BLOCKED
,一个是RUNNABLE
。每隔一段时间,监视器就会选择一个新线程来运行。当发生这种情况时,所选择的/当前线程(例如T1)从RUNNABLE
变为BLOCKED
。然后另一个线程,比如T2,从BLOCKED
转到RUNNABLE
,成为当前线程。
当其中一个线程需要另一个线程提供某些信息时,您使用wait()
。在这种情况下,该帖子将被标记为WAITING
,直到notify()
为止。因此,在此之前,监视器不会执行正在等待的线程。一个例子是,等到有待卸载的盒子。装箱的人会在发生这种情况时通知我。
换句话说,BLOCKED
和WAITING
都是非活动线程的状态,但WAITING
线程不能RUNNABLE
而不能首先转到BLOCKED
。 WAITING
个线程“不希望”变为活动状态,而BLOCKED
个线程“想要”但不能,因为它不是它们的轮流。
我想。
答案 2 :(得分:3)
答案 3 :(得分:1)
等待是什么时候什么也没做。被阻止的是当它试图再次开始运行但尚未被允许时。
答案 4 :(得分:1)
这里有一些令人困惑的术语。 当一个线程调用一个对象等待它进入WAIT状态。 当线程等待获取锁定时,它们属于该锁定的 wait 设置,但它们处于BLOCKED状态。
令人困惑但不知何故有道理!
答案 5 :(得分:0)
提醒一下,你应该总是在while循环中调用wait(),等待进入同步区域/临界区的条件。这是因为Java有“虚假的唤醒”(基本上,线程可以随时无故唤醒)。