模拟仓库容量为1,1个消费者,1个生产者的生产者消费者模型
package com.cskaoyan.sync;
public class Demo3 {
public static void main(String[] args) {
Warehouse warehouse = new Warehouse();
new Thread(new Producer(warehouse),"生产者").start();
new Thread(new Consumer(warehouse),"消费者").start();
}
}
class Producer implements Runnable{
private final Warehouse warehouse;
private static Phone[] phones = {
new Phone("iphone xr",4800),
new Phone("huawei p9",2000),
new Phone("xiaomi",2000),
new Phone("meizu",1000),
};
private Phone producePhone(){
return phones[(int) (Math.random() * phones.length)];
}
public Producer(Warehouse warehouse) {
this.warehouse = warehouse;
}
@Override
public void run() {
synchronized (warehouse){
while (true){
if (warehouse.isEmpty()){
Phone phone = producePhone();
warehouse.pullPhone(phone);
warehouse.notify();
}else {
try {
warehouse.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
class Consumer implements Runnable{
private final Warehouse warehouse;
public Consumer(Warehouse warehouse) {
this.warehouse = warehouse;
}
@Override
public void run() {
synchronized (warehouse){
while (true){
if (warehouse.isEmpty()){
try {
warehouse.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
warehouse.sellPhone();
warehouse.notify();
}
}
}
}
}
class Phone{
private String name;
private double price;
public Phone(String name, double price) {
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "Phone{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
}
class Warehouse{
private Phone phone;
public void pullPhone(Phone phone){
this.phone = phone;
System.out.println(Thread.currentThread().getName() + "生产了一部" + phone + "手机");
}
public void sellPhone(){
Phone sellphone = phone;
phone = null;
System.out.println(Thread.currentThread().getName() + "消费了一部" + sellphone + "手机" );
}
public boolean isEmpty(){
return phone == null;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)