多线程:生产者、消费者问题——多线程的经典案例,一直都晕晕乎乎,今天再看,稍微有了那么点心得就总结一下,加深一下印象。
产生线程安全的原因:
1、多线程
2、操作共同资源
生产者、消费者首先操作的是同一资源,所以要解决首先得解决操作时的同步问题,应该把两者各自的生产和消费函数用synchronized和同一锁旗标锁起来,但这事实上只是解决了生产和消费过程互不打扰,却并没有解决生产和消费的有序过程,如果要解决还要借助于Thread从Object继承的wait()方法和 notify()方法,即当生产者完成后notify()消费者,并wait()等待消费,消费者完成后notify()生产者并wait()生产代码如下(下面代码转用同步代码块,更简洁明了):
class Producer implements Runnable
{
Q q;
public Producer(Q q)
{
this.q=q;
}
public void run()
{
int i=0;
while(true)
{
if(i==0)
q.put("zhangsan","male");
else
q.put("lisi","female");
i=(i+1)%2;
}
}
}
class Consumer implements Runnable
{
Q q;
public Consumer(Q q)
{
this.q=q;
}
public void run()
{
while(true)
{
q.get();
}
}
}
class Q
{
String name="unknown";
String sex="unknown";
boolean bFull=false;
public synchronized void put(String name,String sex) //使用代码块实现同步,简洁明了!!!
{
if(bFull)
try{wait();}catch(Exception e){}
this.name=name;
try{Thread.sleep(1);}catch(Exception e){}
this.sex=sex;
bFull=true;
notify();
}
public synchronized void get()
{
if(!bFull)
try{wait();}catch(Exception e){}
System.out.print(name);
System.out.println(":"+sex);
bFull=false;
notify();
}
}