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

/*
	线程同步之生产者-消费者模型
该模型符合以下要求:
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();
}
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值