Java Thread wait()=>受阻?

时间:2010-03-28 19:12:08

标签: java concurrency

根据Java thread state info调用wait()将导致线程进入BLOCKED状态。但是这段代码将在WAITING状态的Thread中生成(在被调用之后)。

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

}

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

6 个答案:

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

换句话说,BLOCKEDWAITING都是非活动线程的状态,但WAITING线程不能RUNNABLE而不能首先转到BLOCKEDWAITING个线程“不希望”变为活动状态,而BLOCKED个线程“想要”但不能,因为它不是它们的轮流。

我想。

答案 2 :(得分:3)

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

在您关联的同一页面thread.state中,它明确指出

WAITING将在Object.wait()

之后

BLOCKED将在进入同步

之前

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

令人困惑但不知何故有道理!

答案 5 :(得分:0)

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