代码之家  ›  专栏  ›  技术社区  ›  Chris

Java Thread wait()=>阻塞?

  •  9
  • Chris  · 技术社区  · 16 年前

    根据 Java thread state info 调用wait()将导致线程进入阻塞状态。但是,这段代码将导致(在被调用之后)线程处于等待状态。

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

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

    6 回复  |  直到 13 年前
        1
  •  18
  •   Josef Grahn    16 年前

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

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

    和(关于阻止):

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

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

        2
  •  11
  •   zxcvbnm    16 年前

    BLOCKED 一个是 RUNNABLE . 每隔一段时间,监视器就会选择一个新线程来运行。当这种情况发生时,所选/当前线程(比如T1)从 到 此 路 不通 . 然后另一条线,比如说T2,从 此 路 不通 到 可运行的 ,成为当前线程。

    当其中一个线程需要其他线程提供某些信息时,可以使用 wait() . 在这种情况下,线程将被标记为 WAITING 直到它是 notify()

    换句话说,两者都是 此 路 不通 和 等待 是非活动线程的状态,但 等待 线程不能为空 可运行的 而不是去 此 路 不通 第一。 等待 线程“不希望”变为活动状态,而 线程“想”,但不能,因为这不是他们的轮到。

    我想。

        3
  •  4
  •   Yoni Roit    16 年前

    你在哪里看到它这么说的?

    thread.state

    等待将在Object.wait()之后

    在进入同步之前将被阻止

        4
  •  2
  •   AaronM    16 年前

        5
  •  2
  •   Victor Grazi    14 年前

    这里有一些令人困惑的术语。 当线程对对象调用wait时,它将进入wait状态。 当线程 等待 为了抓住锁,它们属于 设置为该锁,但它们处于阻止状态。

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

        6
  •  0
  •   JaHei    16 年前

    作为提醒,您应该始终在while循环中调用wait(),等待进入同步区域/关键部分的条件。这是因为Java有“虚假唤醒”(本质上,线程可以在任何时刻无缘无故地唤醒)。