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时都已经停止了哦,怎么会执行下面的代码呢?
------解决方案-------------------- 探讨 这是典型的死锁问题!!!