/*
线程间通讯:
其实就是多个线程在操作同一个资源,
但是操作的动作不同。
*/
class Res//定义资源
{
String name;
String sex;
boolean flag=false;
}
class Input implements Runnable//定义类Input实现Runnable接口
{
private Res r;
Input(Res r)
{
this.r=r;
}
public void run()//覆盖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="man";
}
//System.out.println(r.name+"....."+r.sex);
else
{
r.name="丽丽";
r.sex="女女女女";
}
}
x=(x+1)%2;
r.flag=true;
r.notify();//唤醒机制
}
}
}
class Output implements Runnable//定义类Output实现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 InputOutputDemo1
{
public static void main(String[] args)
{
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();
//System.out.println("Hello World!");
}
}
问题:1、毕老师课程中讲到“等待和唤醒必须是同一个锁”,那是不是说Input类中的notify唤醒的是Input类中的wait(),Output类中的notify唤醒的是Output类中的wait()?如果不是那执行顺序又是怎样的呢?
2、代码是哪里出了问题,为什么运行不了呢?运行时结果如图。
|
|