生产者消费者模式模型解析

生产者消费者模式一直是行业内一个非常重要的模型,其中涉及多线程的知识。

一般我们将生产者与消费者都作为一个线程来看待,他们分别都有自己的方法,因此用java代码实现2个基本的线程。

class Consumer extends Thread{
	private Resource re;
	public Consumer(Resource re){
		this.re=re;
	}
	public void run(){
		while(true){
			try{
				Thread.sleep(10000);
			}catch(InterruptedException e){
				e.printStackTrace();
			}
			re.remove();
		}
	}
}

class Producer extends Thread{
	private Resource re;
	public Producer (Resource re){
		this.re=re;
	}
	public void run(){
		while(true){
			try{
				Thread.sleep(10000);
			}catch(InterruptedException e){
				e.printStackTrace();
			}
			re.add();
	    }
    }
}

即生产者具有对资源对象进行生产的方法(add),而消费者对资源对象具有购买消费的方法(remove)

Resource 是一种资源对象产品类,具体代码如下

class Resource{
	private int num =0;
	private int size =10;
	
	public synchronized void remove(){
		if(num>0){
			num--;
			System.out.println("Consumer "+Thread.currentThread().getName()+" purchase one goods, "
					+ "current leaves"+num);
			notifyAll();
		}else{
			try{
				wait();
				System.out.print("Consumer "+Thread.currentThread().getName()+" in waiting");
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
	}
	public synchronized void add(){
		if(num<size){
			num++;
			System.out.println(Thread.currentThread().getName()+"produce one goods, current pool have "+num);
			notifyAll();
		}else{
			try{
				wait();
				System.out.println(Thread.currentThread().getName()+"for waiting");
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
	}
}

可以看到Resource类的方法中都用synchronized修饰了,即上了锁

随后再主函数中,创建多个生产者与消费者进行测试

public class CAPpattern {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Resource resource = new Resource();
		Producer p1 =new Producer(resource);
		Producer p2 =new Producer(resource);
		Producer p3 =new Producer(resource);
		
		Consumer c1 =new Consumer(resource);
		Consumer c2 =new Consumer(resource);
		
		p1.start();
		p2.start();
		p3.start();
		c1.start();
		c2.start();
	}	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值