您的位置:首页 > 其它

线程同步之经典生产者-消费者模型

2013-04-09 10:18 543 查看
/*
线程同步之生产者-消费者模型
该模型符合以下要求:
1、生产者只在仓储未满时生产,仓满则停止生产;
2、消费者只在仓储未空时消费,仓空则等待;
3、当消费者发现仓储为空时则通知生产者生产;
4、生产者在生产出可消费产品时则通知消费者来消费;
*/


package one;
class Go{
public static final int MAX_NUM=100;//最大库存量
private int currennum;//当前库存
Go(){}
Go(int currennum){
this.currennum=currennum;
}
public synchronized void produce(int neednum){
System.out.println("要生产的产品数量"+neednum+"与现有仓储靓之和大于最大仓储量"+MAX_NUM+",所以不能生产!!");
while(currennum+neednum>MAX_NUM){
try {
this.wait();//使当前线程阻塞,并释放锁
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
currennum+=neednum;
System.out.println("已经生产了"+neednum+",现在仓储量为:"+currennum);
this.notifyAll();//不释放锁,也不获得锁,仅通知其他线程可以竞争执行
}
public synchronized void consum(int neednum){
while(currennum<neednum){
System.out.println("现有仓储量不足,无法消费!!");
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
currennum-=neednum;
System.out.println("已经消费了"+neednum+",现在仓储量为:"+currennum);
this.notifyAll();
}
}
class Producer extends Thread{
private int neednum;
private Go go;
Producer(int neednum,Go go){
this.neednum=neednum;
this.go=go;
}
public void run(){
go.produce(neednum);
}
}
class Consumer extends Thread{
private int neednum;
private Go go;
Consumer(int neednum,Go go){
this.neednum=neednum;
this.go=go;
}
public void run(){
go.consum(neednum);
}
}
public class Practice extends Thread{
public static void main(String[] args){
Go go=new Go(30);
new Consumer(50,go).start();
new Consumer(20,go).start();
new Consumer(30,go).start();
new Producer(10,go).start();
new Producer(10,go).start();
new Producer(10,go).start();
new Producer(10,go).start();
new Producer(10,go).start();
new Producer(80,go).start();
}
}


摘自:http://blog.csdn.net/kutekute/article/details/8071421
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: