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

多线程问题 wait() notifyAll(); 出错

package test;

public class test {

/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub

final fun ff = new fun();

new Thread(new Runnable() {

@Override
public void run() {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

ff.a();

}
}).start();

new Thread(new Runnable() {

@Override
public void run() {
ff.b();
this.notifyAll();

}
}).start();

}

}

class fun {

public void a() {

for (int i = 0; i < 100; i++)
System.out.println("this  is A:" + i);
}

public void b() {

for (int i = 0; i < 100; i++)
System.out.println("this  is B:" + i);
}

}





报错

Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at test.test$1.run(test.java:18)
at java.lang.Thread.run(Thread.java:680)

Exception in thread "Thread-2" java.lang.IllegalMonitorStateException
at java.lang.Object.notifyAll(Native Method)
at test.test$2.run(test.java:38)
at java.lang.Thread.run(Thread.java:680)
------最佳解决方案--------------------
引用:
再看下这个程序,就可以更了解wait()、notify()的使用方式了。
Java code?12345678910111213141516171819202122232425262728293……

此外,我记得我还回复过楼主在另一个帖子中的问题。

在那个帖子中,我贴了一个很长的程序。
那个程序中,我建了个方法countmoney(),而且在其上加了synchronized。
线程A与线程B都会进入那个countmoney()方法中。这样就是让两个线程进入同一个synchronized域,使用同一个同步锁。在countmoney()方法中具有wait()和notify()方法,就能控制线程A与线程B了。
synchronize作用域都是外部类的实例对象,所以那个程序用的是this。
------其他解决方案--------------------

没有错误呀!!!这是截图
------其他解决方案--------------------
wait 和notify 之类的必须都放在进程同步块或者同步方法中。用synchronized 关键字。
------其他解决方案--------------------
说错了,是线程
引用:
wait 和notify 之类的必须都放在进程同步块或者同步方法中。用synchronized 关键字。

------其他解决方案--------------------
又看到了熟悉的wait()、notify()……线程啥的我最在行了

------其他解决方案--------------------
问题出在这里:
this.wait();
this.notify();
this的实例找不到。注意,这里的this不是指的线程,而是指某个外部类Test的实例对象。通过这个实例对象对线程进行操控。
------其他解决方案--------------------
引用:
问题出在这里:
this.wait();
this.notify();
this的实例找不到。注意,这里的this不是指的线程,而是指某个外部类Test的实例对象。通过这个实例对象对线程进行操控。


借用一下。。。

个人浅显的觉得.
new Thread(new Runnable){
};
这样的方式不太好。。。最大的问题在this的时候找不到实例,建议还是取个名字吧。