学习Java生产者消费者模型,iPhoneX的生产模型。

学生产者消费者模型的时候想到了一个实际的模型,就是iPhoneX手机生产与销售过程。

需求:

    1.多个生产厂商同时生产iPhoneX。

    2.多个销售店同时销售iPhoneX

    3.仓库有容量,不能让iPhoneX数量大于仓库容量,也不能iPhoneX没有了还在售卖。

    生产者消费者的问题早就已经有了,这个模型只是新瓶装旧酒,不过建议可以自己谢谢看,还是比光看来的爽。

学习的知识:多线程、wait 、notify 、synchronized

1、在代码中使用那个对象来wait():
	正确的使用方式是多线程共享的那个Object。(可以在别的线程唤醒它!)
2、哪个对象应该被synchronized
	希望上锁的那个对象应该被synchronized,即那个共享的对象(这是同步的作用)
3、为什么用while中wait();
在While里面使用synchronized解决同时唤醒多个线程中,唤醒了错误的线程,可以用while解决。

参考资料:

https://www.cnblogs.com/maxiaofang/p/5173608.html

http://www.importnew.com/16453.html


下面是代码

Step 1、生产商同时生产iPhoneX

class AppleFactory implements Runnable {
	private WareHouse warehouse;
	private final int MAX_WAREHOUSE = 500;
	public AppleFactory(WareHouse warehouse) {
		this.warehouse = warehouse;
		System.out.println("AF哈希值"+warehouse.hashCode());
	}

	@Override
	public void run() {
		while (true) {
			synchronized (warehouse) {
				while (warehouse.getNum() >= MAX_WAREHOUSE) {
					try {
						warehouse.wait(); // 爆仓停产
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				System.out.println("生产商:" + Thread.currentThread().getName() + "生产iPoneX+1,当前仓库存机" + (warehouse.add()));
				
				warehouse.notifyAll();
			}
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

Step2、销售店销售iPhoneX

class AppleStore implements Runnable {
	private WareHouse warehouse;
	public AppleStore(WareHouse warehouse) {
		this.warehouse = warehouse;
		System.out.println("AS哈希值"+warehouse.hashCode());
	}

	@Override
	public void run() {
		while (true) {
			synchronized (warehouse) {
				while(warehouse.getNum()<=0)
				{
					try {
						warehouse.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				System.out.println("销售商:" + Thread.currentThread().getName() + "卖出iPoneX-1,当前仓库存机" + (warehouse.reduce()));
				warehouse.notifyAll();
			}
		}
	}

}

Step3、封装仓库作为共享数据,供给生产商和销售商访问

class WareHouse{
	private int number = 0;

	public int getNum() {
		return number;
	}

	public void setNumber(int warehouse) {
		this.number = warehouse;
	}
	public int add() {
		return ++number;
	}
	public int reduce() {
		return --number;
	}
}

Step4、主程序

public static void main(String[] args) {
		WareHouse wh = new WareHouse();
		AppleFactory af = new AppleFactory(wh);
		AppleStore as = new AppleStore(wh);

		new Thread(af).start();
		new Thread(as).start();
		new Thread(af).start();
		new Thread(as).start();
		new Thread(af).start();
		new Thread(as).start();
	}

结果:

AF哈希值2018699554
AS哈希值2018699554
生产商:Thread-0生产iPoneX+1,当前仓库存机1
生产商:Thread-2生产iPoneX+1,当前仓库存机2
销售商:Thread-1卖出iPoneX-1,当前仓库存机1
销售商:Thread-1卖出iPoneX-1,当前仓库存机0
生产商:Thread-4生产iPoneX+1,当前仓库存机1
销售商:Thread-3卖出iPoneX-1,当前仓库存机0
生产商:Thread-4生产iPoneX+1,当前仓库存机1
销售商:Thread-5卖出iPoneX-1,当前仓库存机0
生产商:Thread-2生产iPoneX+1,当前仓库存机1
生产商:Thread-0生产iPoneX+1,当前仓库存机2
销售商:Thread-3卖出iPoneX-1,当前仓库存机1
销售商:Thread-3卖出iPoneX-1,当前仓库存机0
生产商:Thread-4生产iPoneX+1,当前仓库存机1
销售商:Thread-5卖出iPoneX-1,当前仓库存机0
生产商:Thread-2生产iPoneX+1,当前仓库存机1
生产商:Thread-0生产iPoneX+1,当前仓库存机2
销售商:Thread-3卖出iPoneX-1,当前仓库存机1
销售商:Thread-3卖出iPoneX-1,当前仓库存机0
生产商:Thread-2生产iPoneX+1,当前仓库存机1
销售商:Thread-5卖出iPoneX-1,当前仓库存机0
生产商:Thread-4生产iPoneX+1,当前仓库存机1


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值