本帖最后由 ぺsimon☆ 于 2013-5-17 13:54 编辑
/*
生产者和消费者的升级版
问题:t1进来判断flag=false,输入数据,然后把flag置为true ,然后出了同步函数,假设这时候是t2抢到了cpu执行权,运行run方法中的代码
发现false为true,读了wait()方法
那么这时我就不懂了,t2在同步函数里等着了,虽然释放了执行权,但是它是在同步函数里的,老师说同步函数中只能有一个线程存在,t2还没执行完同步函数
那么这时候t1,t3和t4就进不去了啊,我的理解是这样,希望兄弟们说个明白
还有如果t2读到的是sleep方法,又会怎样呢?
*/
class Res
{
private String name;
private String sex;
private boolean flag=false;
public synchronized void setRes(String name,String sex)
{
//当flag为true时生产者就等待,否则就生产
//这里等待线程醒来之后要判断flag的值,以免造成安全隐患
while(flag)
try{this.wait();}catch(Exception e){}
this.name=name;
this.sex=sex;
System.out.println(Thread.currentThread().getName()+"生产者"+name+"..."+sex);
flag=true;
//这里用notifyAll唤醒所有线程,避免唤醒的是本方线程,注意如果用notify,它唤醒的是进入线程 池中的第一个线程,有可能唤醒的是本方线程,造成所有的线程都在等待
this.notifyAll();
}
public synchronized void getRes()
{
//当flag为false时消费者就等待,否则就消费
while(!flag)
try{this.wait();}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"消费者"+name+"-----"+sex);
flag=false;
this.notifyAll();
}
}
class Input implements Runnable
{
private Res r;
Input(Res r)
{
this.r=r;
}
public void run()
{
int x=0;
while(true)
{
if(x==0)
{
r.setRes("mike","man");
}
r.setRes("丽丽","女");
x=(x+1)%2;
}
}
}
class Output implements Runnable
{
private Res r;
Output(Res r)
{
this.r=r;
}
public void run()
{
while(true)
r.getRes();
}
}
class InputOutputDemo
{
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(in);
Thread t3=new Thread(out);
Thread t4=new Thread(out);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
|