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