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()编辑。 因此,在此之前,监视器不会执行正在等待的线程。 一个例子是,等到有待卸载的盒子。 装箱的人会在发生这种情况时通知我。

换句话说, BLOCKEDWAITING都是非活动线程的状态,但是如果没有先进行BLOCKED ,则WAITING线程不能是RUNNABLEWAITING线程“不希望”变为活动状态,而BLOCKED线程“想要”但不能,因为它不是轮流。

我认为。

你在哪里看到它说的那样的东西?

在你链接的同一页面中, thread.state ,它清楚地说明了这一点

等待将在Object.wait()之后

BLOCKED将在进入同步之前

等待是什么时候什么也没做。 被阻止的是当它试图再次开始运行但尚未被允许时。

这里有一些令人困惑的术语。 当一个线程调用一个对象等待它进入WAIT状态。 当线程等待获取锁时,它们属于该锁的等待集,但它们处于BLOCKED状态。

令人困惑,但不知何故,这是有道理的!

提醒一下,你应该总是在while循环中调用wait(),等待进入同步区域/临界区的条件。 这是因为Java有“虚假的唤醒”(基本上,线程可以随时无故唤醒)。