生產者消費者

生產者消費者

生產者消費者模式概述

image.png
image.png

生產者消費者案例

image.png

//奶箱類
public class Box{
    //定義一個成員變量,表示第x瓶奶
    private int milk;
    
    //定義一個成員變量表示奶箱的狀態
    private boolean state = false;
    //提供存儲牛奶和獲取牛奶的操做
    public synchronized void put(int milk){
        //若是有牛奶,應該是等待消費
        if(state){
            wait();//alt enter捕獲異常
        }
        //若是沒有牛奶,就生產牛奶
        this.milk = milk;
        sout("送奶工將第"+this.milk+"瓶奶放入奶箱"); 
        //生產完畢以後,就要修改奶箱狀態
        state = true;
        //而後還要喚醒其餘等待的線程
        notifyAll();
        
    }
    public synchronized void get(int milk){
        //若是沒有牛奶,等待生產
        if(!state){
            wait();//alt enter捕獲異常
        }
        //若是有牛奶,就消費牛奶
        this.milk = milk;
        sout("用戶拿到第"+this.milk+"瓶奶"); 
        //消費完畢以後,就要修改奶箱狀態
        state = false;
        //而後還要喚醒其餘等待的線程
        notifyAll();
    }
}

//生產者類
public class Producer implements Runnable{
    private Box b;
    public Producer(Box b){
        this.b = b;
    }
    @Override
    public void run(){
        for(int i=1;i<=5;i++){
            b.put(i);
        }
}

//消費者類
public class Customer implements Runnable{
    private Box b;
    public Customer (Box b){
        this.b = b;
    }
    @Override
    public void run(){
        while(true){
            b.get();
        }
    }
}

//測試類 主程序
//建立奶箱對象,這事共享數據區域
Box b = new Box();
//建立生產者對象,把奶箱對象做爲構造方法參數傳遞,由於再這個類中要調用存儲牛奶的操做
Producer p = new Producer(b);
//建立消費者對象,把奶箱對象做爲構造方法參數傳遞,由於再這個類中要調用獲取牛奶的操做
Customer c = new Customer (b);
//建立兩個線程對象,分別把生產者對象和消費者對象爲構造方法參數傳遞
Thread t1 = new Thread(p);
Thread t2 = new Thread(c);
//啓動線程
t1.start();
t2.start();
相關文章
相關標籤/搜索