学生产者消费者模型的时候想到了一个实际的模型,就是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