日期:2014-05-20  浏览次数:20815 次

notify无法唤醒wait的问题
为了提问方便,写了一段程序,不明白为什么notify不能唤醒wait。预期输出应该是不停的输出1,为什么只输出一个1,然后就不动了?
Java code
class Test implements Runnable {

    public void run() {
        try {
            while (true) {
                System.out.print(1);
                synchronized (this) {
                    wait();
                    notify();
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public class bk {

    public static void main(String[] args) {
        Test t = new Test();
        new Thread(t).start();
    }

}


------解决方案--------------------
wait();//这里加上时间就好了。比如wait(1000)
------解决方案--------------------
你应该用另外一条线程notify它
wait时都已经停止了哦,怎么会执行下面的代码呢?
------解决方案--------------------
这个当然不会唤醒了,就如同你把自己催眠了怎么可能再由自己来叫醒自己呢??
------解决方案--------------------
恩恩,需要另外一个线程去监听这个线程的状态,然后notify,4楼正解
------解决方案--------------------
一个线程wait没有参数,自己进入等待队列.没有别人叫他.他都没机会运行呀.notify()执行不到呀.
要写另外一个线程,调用notifyAll()/notify(),才能把他救出来呀.
------解决方案--------------------
当前的线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的所有权后才能继续执行。 

对于某一个参数的版本,实现中断和虚假唤醒是可能的,而且此方法应始终在循环中使用:


你的线程住于等待状态 


你却又想让他去唤醒自己。。。好像 没有 自己已经熟睡的 还可以随时叫醒自己 。。。

API 参考~。~

------解决方案--------------------
顶!!!!!!!!!!
------解决方案--------------------
这是典型的死锁问题!!!
------解决方案--------------------
自己睡着了wait开始等待,你自己可以叫醒你自己吗? 典型的....
------解决方案--------------------
顶16搂!
------解决方案--------------------
探讨
你应该用另外一条线程notify它
wait时都已经停止了哦,怎么会执行下面的代码呢?

------解决方案--------------------
探讨
这是典型的死锁问题!!!