生產者消費者
生產者消費者模式概述


生產者消費者案例

//奶箱類
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();