問題描述:生產者生產一個產品然後放入緩衝區,消費者從緩衝區拿一個產品出來,生產一個消費一個。
一開始接觸這個問題時,參考網上的教程自己寫了一個簡單的代碼:
class Test{//測試類
public static void main(String[] args){
Producer producer = new Producer();
Consumer consumer = new Consumer();
producer.start();
consumer.start();
}
}
class Buffer{//緩衝區類
private production = 0;
private boolean avilible = false;
public synchronized void put(int value){//設置線程鎖,保證生產產品的時候,消費者不會消費
while(avilible == true){
try{
wait();
}catch(Exception e){
}
}//close while
production = value;
avilible = true;
notifyAll();
}//close put()
public synchronized int get(){
while(avilible == false){
try{
wait();
}catch(Exception e){
}//close catch
}//close while
avilible = false;
notifyAll();
return production;
}//close get()
}//close class buffer
class Producer extends Thread{
Buffer buffer = new Buffer();
@Override
public void run(){
for(int i=0;i<10;i++){
buffer.put(i);
System.out.println("生產產品:"+i);
try{
sleep(50);
}catch(Exception e){}
}
}//close run()
}
class Consumer extends Thread{
Buffer buffer = new Buffer();
@Override
public void run(){
for(int i=0;i<10;i++){
int production = buffer.get();
System.out.println("消費產品:"+production);
}
}//close run()
}
按理來說是沒有問題,結果運行的結果一直就是:
生產了產品 0
最後才發現有處邏輯不對,問題在於我在每個線程中都創建了一個buffer對象,這導致消費者和生產者用的不是用一個緩衝區,這個問題也是出現的很搞笑。改正代碼就是讓生產者消費者共用一個buffer對象。更改後的運行結果:
生產了產品:0
消費了產品:0
生產了產品:1
消費了產品:1
消費了產品:2
生產了產品:2
生產了產品:3
消費了產品:3
消費了產品:4
生產了產品:4
生產了產品:5
消費了產品:5
生產了產品:6
消費了產品:6
生產了產品:7
消費了產品:7
生產了產品:8
消費了產品:8
生產了產品:9
消費了產品:9
由於打印的地方沒有加鎖,所以也會有競態的出現。以上的來源於本人的愚解。有問題或者不對的地方,歡迎大家留言交流。