生产消费者模型-java

生产消费者模型是多线程的典型代表,下面简单实现一下:

1.定义一个仓库的接口

package threadtext.procon;
//仓库接口
public interface AbstraceStorage {
	void consume(int num);
	void product(int num);
}

2.定义一个具体的仓库,实现上面的接口

package threadtext.procon;

import java.util.LinkedList;

public class Storage implements AbstraceStorage{
	private final int MAX_SIZE=100;
	private LinkedList list=new LinkedList();
	
	@Override
	public void consume(int num) {
		// TODO 自动生成的方法存根
		synchronized (list) {
			while(list.size()<num) {
				 System.out.println("【要消费的产品数量】:" + num + "\t【库存量】:"+ list.size() + "\t暂时不能执行消费任务!");
				try {
					list.wait(2000);
				} catch (InterruptedException e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
			}
			for(int i=0;i<num;i++) {
				list.remove();
			}
			System.out.println("【已经消费的产品数】:"+num+"\t【现储存量为】:"+list.size());
			list.notifyAll();
		}
	}

	@Override
	public void product(int num) {
		// TODO 自动生成的方法存根
		synchronized (list) {
			while(list.size()+num>MAX_SIZE) {
				 System.out.println("【要生产的产品数量】:" + num + "\t【库存量】:"+ list.size() + "\t暂时不能执行生产任务!");
				try {
					list.wait();
				} catch (InterruptedException e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
			}
			for(int i=0;i<num;i++)
					list.add(new Object());
			 System.out.println("【已经生产产品数】:" + num + "\t【现仓储量为】:" + list.size());
			 list.notifyAll();
		}
	}
	
}

3.生产者类

package threadtext.procon;
//生产者类
public class Producer extends Thread {
	private int num;
	public AbstraceStorage abstraceStorage;
	public Producer(AbstraceStorage abstraceStorage) {
		this.abstraceStorage=abstraceStorage;
		// TODO 自动生成的构造函数存根
	}
	
	public void setNum(int num) {
		this.num=num;
	}
	public void produce(int num) {
		abstraceStorage.product(num);
	}
	public void run() {
		produce(num);
	}
}

4.消费者类

package threadtext.procon;
//消费者类
public class Consumer extends Thread {
	private int num;
	public AbstraceStorage abstraceStorage;
	
	public Consumer(AbstraceStorage abstraceStorage) {
		this.abstraceStorage=abstraceStorage;
		// TODO 自动生成的构造函数存根
	}
	
	public void setNum(int num) {
		this.num=num;
	}
	public void consum(int num) {
		this.abstraceStorage.consume(num);
	}
	public void run() {
		consum(num);
	}
}

5.测试类

package threadtext.procon;

public class Text {
	public static void main(String[] args) {
		AbstraceStorage abstraceStorage=new Storage();
		
		//生产者对象
		Producer p1=new Producer(abstraceStorage);
		Producer p2=new Producer(abstraceStorage);
		Producer p3=new Producer(abstraceStorage);
		Producer p4=new Producer(abstraceStorage);
		Producer p5=new Producer(abstraceStorage);
		Producer p6=new Producer(abstraceStorage);
		Producer p7=new Producer(abstraceStorage);
		
		//消费者对象
		Consumer c1=new Consumer(abstraceStorage);
		Consumer c2=new Consumer(abstraceStorage);
		Consumer c3=new Consumer(abstraceStorage);
		
		//设置生产者产品生产数量
		p1.setNum(10);
		p2.setNum(20);
		p3.setNum(30);
		p4.setNum(40);
		p5.setNum(30);
		p6.setNum(20);
		p7.setNum(80);
		
		//设置消费者产品消费数量
		c1.setNum(50);
		c2.setNum(70);
		c3.setNum(20);
		//生产者开始生产
		c1.start();
		c2.start();
		c3.start();
		//消费者开始消耗
		p1.start();
		p2.start();
		p3.start();
		p4.start();
		p5.start();
		p6.start();
		p7.start();
		
	}
}

7.结果

【要消费的产品数量】:50	【库存量】:0	暂时不能执行消费任务!
【已经生产产品数】:40	【现仓储量为】:40
【已经生产产品数】:30	【现仓储量为】:70
【已经生产产品数】:20	【现仓储量为】:90
【已经生产产品数】:10	【现仓储量为】:100
【已经消费的产品数】:20	【现储存量为】:80
【已经消费的产品数】:70	【现储存量为】:10
【要消费的产品数量】:50	【库存量】:10	暂时不能执行消费任务!
【已经生产产品数】:80	【现仓储量为】:90
【要生产的产品数量】:20	【库存量】:90	暂时不能执行生产任务!
【要生产的产品数量】:30	【库存量】:90	暂时不能执行生产任务!
【已经消费的产品数】:50	【现储存量为】:40
【已经生产产品数】:30	【现仓储量为】:70
【已经生产产品数】:20	【现仓储量为】:90
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值