notify无法唤醒wait的问题

Kasbaster 2008-03-26 04:38:10
为了提问方便,写了一段程序,不明白为什么notify不能唤醒wait。预期输出应该是不停的输出1,为什么只输出一个1,然后就不动了?
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();
}

}
...全文
339 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
math_man 2008-03-27
  • 打赏
  • 举报
回复
这是典型的死锁问题!!!
nihuajie05 2008-03-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 math_man 的回复:]
这是典型的死锁问题!!!
[/Quote]
这个不是死锁的典型概念吧
虽然有相似点.
nihuajie05 2008-03-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zapdos 的回复:]
你应该用另外一条线程notify它
wait时都已经停止了哦,怎么会执行下面的代码呢?
[/Quote]
xms_999 2008-03-27
  • 打赏
  • 举报
回复
顶16搂!
Kasbaster 2008-03-27
  • 打赏
  • 举报
回复
自己顶
wangtoby 2008-03-27
  • 打赏
  • 举报
回复
自己睡着了wait开始等待,你自己可以叫醒你自己吗? 典型的....
林g 2008-03-26
  • 打赏
  • 举报
回复
顶!!!!!!!!!!
Kasbaster 2008-03-26
  • 打赏
  • 举报
回复
另外,我还发了一个帖子,也是notify的问题的,大家有空能去看一下的话,感激不尽。。。。
http://topic.csdn.net/u/20080326/17/7d00ce09-7d4c-4faf-9e15-d9fd324b60ac.html
Kasbaster 2008-03-26
  • 打赏
  • 举报
回复
多谢上面的各位,我大概理解了你们的意思。我重新写了一下,不知道大家的意思是不是这样:将一个线程的对象作为参数传给另一个线程。是不是所有使用wait和notify的都得这么用啊?
class Test implements Runnable {

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

class Test1 implements Runnable {

private Test test = null;

Test1(Test t){test = t;}

public void run() {
while (true) {
synchronized (test) {
test.notify();
}
}
}
}

public class bk {

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

}
sailyyang 2008-03-26
  • 打赏
  • 举报
回复
当前的线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的所有权后才能继续执行。

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


你的线程住于等待状态


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

API 参考~。~
rock406 2008-03-26
  • 打赏
  • 举报
回复
一个线程wait没有参数,自己进入等待队列.没有别人叫他.他都没机会运行呀.notify()执行不到呀.
要写另外一个线程,调用notifyAll()/notify(),才能把他救出来呀.
Kasbaster 2008-03-26
  • 打赏
  • 举报
回复
能给出一个具体的代码么,我实在是想不出来了。多谢啦。
Kasbaster 2008-03-26
  • 打赏
  • 举报
回复
针对以上那个代码,怎么能用别的线程唤醒原先的线程呢?
Tayita 2008-03-26
  • 打赏
  • 举报
回复
恩恩,需要另外一个线程去监听这个线程的状态,然后notify,4楼正解
hjxaut 2008-03-26
  • 打赏
  • 举报
回复
这个当然不会唤醒了,就如同你把自己催眠了怎么可能再由自己来叫醒自己呢??
zapdos 2008-03-26
  • 打赏
  • 举报
回复
你应该用另外一条线程notify它
wait时都已经停止了哦,怎么会执行下面的代码呢?
Tayita 2008-03-26
  • 打赏
  • 举报
回复
不好意思理解错了,debug了一下,运行到wait()的时候线程就停止了,下面这行notify()也就不会被执行
线程不太懂,我再想想。顺便等高人来
Kasbaster 2008-03-26
  • 打赏
  • 举报
回复
就是不想加时间的
Tayita 2008-03-26
  • 打赏
  • 举报
回复
wait();//这里加上时间就好了。比如wait(1000)

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧