Java生产者与消费者模式

分析

分析
    工厂
        属性:
            剩余商品数量
            最大商品数量
        方法:
            生产
                判断剩余商品数量是否最大商品数量
                    大于:无限期休眠
                    小于:
                        剩余商品数量++
                        通知可以开始销售
            销售
                判断剩余商品数量是否小于等于0
                    小于等于0:无限期休眠
                    反之:
                        剩余商品数量--
                        通知可以开始生产
    生产人员:线程
        属性:工厂对象
        方法:run
            无限生产
    销售人员:线程
        属性:工厂对象
        方法:run
            无限销售
    注意:保证工厂对象是同一个

代码

package com.qf.demo11;
/**
 * 生产任务
 */
public class ShengChan implements Runnable{
	private Factory factory;
	
	public ShengChan(Factory factory) {
		super();
		this.factory = factory;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
			factory.add();
		}
	}
}
package com.qf.demo11;
/**
 * 工厂类
 */
public class Factory {
	//剩余商品数量
	private int num = 0;
	//最大商品数量
	private static final int MAX_NUM = 10;
	
	//生产方法
	public synchronized void add() {
		if (num >= MAX_NUM) {
			System.out.println("仓库已满");
			String name = Thread.currentThread().getName();
			System.out.println(name+"停止生产");
			try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.print("原商品剩余:"+num+"件");
			num++;
			String name = Thread.currentThread().getName();
			System.out.println(name+"生产了一件,先在商品剩余数量为:"+num+"件");
			this.notifyAll();
		}
	}
	
	//销售的方法
	public synchronized void get() {
		if (num <= 0) {
			System.out.println("仓库中已经没有商品");
			String name = Thread.currentThread().getName();
			System.out.println(name+"停止销售");
			try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else {
			try {
				Thread.sleep(800);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.print("原商品剩余:"+num+"件");
			num--;
			String name = Thread.currentThread().getName();
			System.out.println(name+"销售了一件,先在商品剩余数量为:"+num+"件");
			this.notifyAll();
		}
	}
}
package com.qf.demo11;
/**
 * 生产任务
 */
public class ShengChan implements Runnable{
	private Factory factory;
	
	public ShengChan(Factory factory) {
		super();
		this.factory = factory;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
			factory.add();
		}
	}
}

测试类

package com.qf.demo11;

public class Demo11 {
	public static void main(String[] args) {
		//工厂对象
		Factory factory = new Factory();
		
		ShengChan sc01 = new ShengChan(factory);
		ShengChan sc02 = new ShengChan(factory);
		
		XiaoShou xs01 = new XiaoShou(factory);
		XiaoShou xs02 = new XiaoShou(factory);
		XiaoShou xs03 = new XiaoShou(factory);
		
		Thread t01 = new Thread(sc01, "老李");
		Thread t02 = new Thread(sc02, "王工");
		
		Thread t03 = new Thread(xs01, "小娜");
		Thread t04 = new Thread(xs02, "小丽");
		Thread t05 = new Thread(xs03, "小美");
		
		t01.start();
		t02.start();
		t03.start();
		t04.start();
		t05.start();
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值