黑马程序员技术交流社区
标题:
线程通信问题!不能运行!求指点!
[打印本页]
作者:
ying
时间:
2013-1-7 13:47
标题:
线程通信问题!不能运行!求指点!
本帖最后由 ying 于 2013-1-8 13:14 编辑
<P>class Res
{
String name;</P>
<P> String sex;</P>
<P> boolean flag = false;</P>
<P>}
/*
Input线程负责
向资源对象中存放数据
*/
class Input implements Runnable
{
private Res r ;
Object obj = new Object();
Input(Res r)
{
this.r = r;
}</P>
<P> public void run()
{
int x = 0;
while(true)
{
synchronized(r)
{
if(r.flag)
try{r.wait();}catch(Exception e){};
if(x == 0)
{
r.name = "mike";
r.sex = "male";
x = 1;
}else{
r.name = "丽丽";
r.sex = "女女女女女";
x = 0;
}
r.flag = true ;
notify();
}
}
}
}
/*
Output此线程负责
从资源对象中取出数据并打印
*/
class Output implements Runnable
{
private Res r ;</P>
<P> Output(Res r)
{
this.r = r;
}
public void run()
{
while(true)
{
synchronized(r)
{
if(!r.flag)
try{r.wait();}catch(Exception e){};
System.out.println(r.name + "..." + r.sex);
r.flag = false;
notify();
}
}
}
}
/*
演示线程同步及线程通信
*/
class InputOutputDemo
{
public static void main(String[] args)
{
//创建资源对象 Input和Output线程共享此资源
Res r = new Res();
Input in = new Input(r);</P>
<P> Output out = new Output(r);</P>
<P> //创建线程t1和t2 并分别启动
Thread t1 = new Thread(in);
Thread t2 = new Thread(out);</P>
<P> t1.start();
t2.start();</P>
<P>
}
}</P>
复制代码
本人对线程中的wait()和notify()方法不太理解,我的这段代码可以编译但不可以执行,出现异常如下!谁能帮忙看看指点一下!
thread.jpg
(62.36 KB, 下载次数: 45)
下载附件
2013-1-7 13:46 上传
作者:
希望的曙光
时间:
2013-1-7 14:39
看一下官方的解释
void notify() :唤醒在此对象监视器上等待的单个线程
void notifyAll() :唤醒在此对象监视器上等待的所有线程
void wait(): 导致当前的线程等待,直到其他线程调用此对象的notify()方法或notiyAll()方法
49.class Output implements Runnable
50.{
51. private Res r ;</P>
52.<P> Output(Res r)
53. {
54. this.r = r;
55. }
56. public void run()
57. {
58. while(true)
59. {
60. synchronized(r)
61. {
62. if(!r.flag)
63. try{r.wait();}catch(Exception e){};
64. System.out.println(r.name + "..." + r.sex);
65. r.flag = false; //把这改成true
66. notify();
67. }
68. }
69. }
作者:
熊永标
时间:
2013-1-7 16:11
package cn.javastudy.demo1;
class Res
{
String name;
String sex;
boolean flag = false;
}
/*
Input线程负责
向资源对象中存放数据
*/
class Input implements Runnable
{
private Res r ;
Object obj = new Object();
Input(Res r)
{
this.r = r;
}
public void run()
{
int x = 0;
while(true)
{
synchronized(r)
{
if(r.flag)
try{r.wait();}catch(Exception e){};
if(x == 0)
{
r.name = "mike";
r.sex = "male";
x = 1;
}else{
r.name = "丽丽";
r.sex = "女女女女女";
x = 0;
}
r.flag = true ;
r.notify();
}
}
}
}
/*
Output此线程负责
从资源对象中取出数据并打印
*/
class Output implements Runnable
{
private Res r ;
Output(Res r)
{
this.r = r;
}
public void run()
{
while(true)
{
synchronized(r)
{
if(!r.flag)
try{r.wait();}catch(Exception e){};
System.out.println(r.name + "..." + r.sex);
r.flag = false;
r.notify();
}
}
}
}
/*
演示线程同步及线程通信
*/
class InputOutputDemo
{
public static void main(String[] args)
{
//创建资源对象 Input和Output线程共享此资源
Res r = new Res();
Input in = new Input(r);
Output out = new Output(r);
//创建线程t1和t2 并分别启动
Thread t1 = new Thread(in);
Thread t2 = new Thread(out);
t1.start();
t2.start();
}
}
复制代码
你的notify()不是对应锁的监视器,而是this的监视器,所以会发生错误.我给你的这段代码才是正确的,应该用r.notify(),因为你的锁是r对象,且你用r的wait()
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2