黑马程序员技术交流社区
标题:
关于day12进程间通信,求解!!!
[打印本页]
作者:
troy健
时间:
2014-7-18 10:28
标题:
关于day12进程间通信,求解!!!
package cn.itheima.day11;
class Res{
String name;
String sex;
boolean flag =false;
}
class Input implements Runnable{
private Res r;
Input(Res r){
this.r = r;
}
public void run(){
int x = 0;
while(true){
synchronized(r){
if(r.flag)
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(x == 0){
r.name = "mike";
r.sex = "man";
}else{
r.name = "丽丽";
r.sex = "女";
}
x = (x+1)%2;
r.flag = true;
notify();
}
}
}
}
class Output implements Runnable{
private Res r;
Output(Res r){
this.r = r;
}
public void run(){
while(true){
synchronized (r) {
if(!r.flag)
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(r.name + "...." + r.sex);
r.flag = false;
notify();
}
}
}
}
public class 线程间通信 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Res r = new Res();
Input in = new Input(r);
Output out = new Output(r);
Thread t1 =new Thread(in);
Thread t2 = new Thread(out);
t1.start();
t2.start();
}
}
复制代码
这是代码,毕老师day12的示例代码。问题:
mike....man
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at cn.itheima.day11.Input.run(线程间通信.java:35)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at cn.itheima.day11.Output.run(线程间通信.java:60)
at java.lang.Thread.run(Thread.java:745)
复制代码
求解释
作者:
ddewym123
时间:
2014-7-18 10:43
你两个线程中的wait()方法与notify()方法均未加上调用的对象,就默认是线程自身的wait()方法与notify(),即Input与Output类自身的wait()方法与notify()。这样两个的线程的锁是不一样的。我们要实现同步,锁要求一样,将线程中的这四句代码分别改为: r.wait()与r.notify()。
作者:
苗润
时间:
2014-7-18 11:13
notify方法,唤醒wait了的方法,那么多的线程,你要唤醒哪一个,唤醒拥有相同的锁在线程池中等待的第一个线程因此,上面的程序应该在wait时应该写成r.wait(); notify写为r.notify();,线程同步的前提,锁相同,操作的数据相同
修改后程序结果如此:
8BH(P(8OI`I{][2$W@85CVR.jpg
(47.2 KB, 下载次数: 28)
下载附件
2014-7-18 11:13 上传
作者:
吴杰栋
时间:
2014-7-19 14:40
方法的调用需要对象,控制台报错的那几行代码,直接就一个裸体的方法,没有用对象去调用
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2