生产者消费者模式

1.基本角色

仓库、 生产者、 消费者

2.基本思想

仓库里放着俩引擎,一个生成一个消费。
仓库有一个初始化的最大存放量,当消费者消费完所有的产品,则消费的线程进人等待,然后唤醒所有的生产者线程开始生产。当生成到仓库最大库存就让生产者进入等待,并唤醒消费者进行消费。

3.示例

--仓库--
public class CangKu {

// 仓库最大的容量
private final int MAX_SIZE = 100;

// 载体 双向链表/队列
LinkedList linkedList = new LinkedList();

/**
 * 生产者方法/引擎
 */
public void produce(int num) {

    synchronized (linkedList) {
        while(linkedList.size() + num > MAX_SIZE) {
            System.out.println("无法生产,大于仓库最大容量");
            
            try {
                linkedList.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }   
        }
        //消费者消耗部分,while条件不成立,继续执行for
        for(int i=1;i<=num;++i) {
            linkedList.add(new Object());   
        }
        System.out.println("【已经生产粮食】:" + num + "/t【仓库中粮食总量】:" + linkedList.size());
        linkedList.notifyAll();
        
    }
}   

/**
 * 消费者方法/引擎
 */
public void consumer(int num) {
    
    synchronized(linkedList){
        while(linkedList.size() < num) {
            System.out.println("粮食不足,停止消费");
            try {
                linkedList.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //粮食充足可以消费 
        for(int i=1;i<=num;++i) {
            linkedList.remove();
        }
        System.out.println("【已经消费产品数】:" + num + "/t【现仓库存储量为】:" + linkedList.size());
        //唤醒全部生产者
        linkedList.notifyAll();
    }
}
}


--消费者--
public class Consumers extends Thread{

private int num;

private CangKu cangku;

public int getNum() {
    return num;
}

public void setNum(int num) {
    this.num = num;
}

Consumers(CangKu cangku){
    this.cangku = cangku;
}

public void consumer(int num) {
    cangku.consumer(num);
}

@Override
public void run() {
    consumer(num);
}   
}

--生产者--
public class Producters extends Thread{

private int num;

private CangKu cangku;

public int getNum() {
    return num;
}

public void setNum(int num) {
    this.num = num;
}

Producters(CangKu cangku){
    this.cangku = cangku;
} 

public void produce(int num) {
    cangku.produce(num);
}

@Override
public void run() {
    produce(num);   
}
}

main

public class MainTest {

public static void main(String[] args) {
    //仓库
    CangKu cangku = new CangKu();
    
    Producters producters1 = new Producters(cangku);
    producters1.setNum(10);
    
    Producters producters2 = new Producters(cangku);
    producters2.setNum(20);
    
    Producters producters3 = new Producters(cangku);
    producters3.setNum(30);
    
    Producters producters4 = new Producters(cangku);
    producters4.setNum(40);
    
    Producters producters5 = new Producters(cangku);
    producters5.setNum(50);
    
    Producters producters6 = new Producters(cangku);
    producters6.setNum(60);
    
    Producters producters7 = new Producters(cangku);
    producters7.setNum(70);
    
    Producters producters8 = new Producters(cangku);
    producters8.setNum(80);
    
    //八个生产者
    new Thread(producters1).start();
    new Thread(producters2).start();
    new Thread(producters3).start();
    new Thread(producters4).start();
    new Thread(producters5).start();
    new Thread(producters6).start();
    new Thread(producters7).start();
    new Thread(producters8).start();
   
 
    
    Consumers consumers1 = new Consumers(cangku);
    consumers1.setNum(10);
    
    Consumers consumers2 = new Consumers(cangku);
    consumers2.setNum(20);
    
    Consumers consumers3 = new Consumers(cangku);
    consumers3.setNum(30);
    
    Consumers consumers4 = new Consumers(cangku);
    consumers4.setNum(40);
    
    //四个消费者
    new Thread(consumers1).start();
    new Thread(consumers2).start();
    new Thread(consumers3).start();
    new Thread(consumers4).start();
    
    
}
}

你可能感兴趣的:(生产者消费者模式)