Java Thread wait() = >阻塞?

2022-09-05 00:26:12

根据 Java 线程状态信息调用 wait() 将导致线程进入阻塞状态。但是,这段代码将(在调用后)在等待状态下导致线程。

class bThread extends Thread {
    public synchronized void run() {
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

我有没有做错什么?任何人都可以向我解释这种行为吗?任何帮助将不胜感激!


答案 1

线程正在等待,直到收到通知。然后,它变为“已阻止”,尝试重新进入同步区域,直到所有其他线程都离开。

您发布的链接中的相关部分(关于等待):

例如,在对象上调用 Object.wait() 的线程正在等待另一个线程在该对象上调用 Object.notify() 或 Object.notifyAll()。

和(关于已阻止):

处于阻塞状态的线程正在等待监视器锁 [...] 在调用 Object.wait 后重新输入同步的块/方法。

最后一部分发生在线程尝试从 wait() 返回时,但在此之前不会发生。


答案 2

监视器一次执行一个线程。假设您有 T1-T10 线程,则 9 个是 ,一个是 。每隔一段时间,监视器就会选取一个新线程来运行。发生这种情况时,所选/当前线程(例如 T1)将从 到 。然后另一个线程,比如 T2,从 到 ,成为当前线程。BLOCKEDRUNNABLERUNNABLEBLOCKEDBLOCKEDRUNNABLE

当其中一个线程需要一些信息可供另一个线程使用时,可以使用 。在这种情况下,线程将被标记为直到它被 ed。因此,在此之前,监视器不会执行正在等待的线程。一个例子是,等到有箱子要卸下。当这种情况发生时,装载箱子的人会通知我。wait()WAITINGnotify()

换句话说,两者都是非活动线程的状态,但线程不能不先去。 线程“不想”变为活动状态,而线程“想要”变为活动状态,但不能,因为轮不到它们。BLOCKEDWAITINGWAITINGRUNNABLEBLOCKEDWAITINGBLOCKED

我认为。


推荐