一、什麼是生產者與消費者模式
其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不讓消費者訪問,當消費者消費時鎖住倉庫,不讓生產者訪問倉庫。舉乙個簡單的例子,有乙個生產者生產包子,他將生產好的包子放到筐中,放完包子由消費者從筐中拿出包子使用。當然筐還有乙個作用就是當筐中沒有包子時便鎖住筐,不讓消費者去筐中再拿取東西,當筐中有包子時,不讓生產者再向筐中放入包子。
二、實現生產者與消費者模式
乙個簡單的方法就是使用使用object的wait/notify的訊息通知機制
wait():呼叫了wait()方法的執行緒進入等待池進行等待,等待池中的執行緒不去競爭物件鎖,直到其它的執行緒通知,才會進入鎖池
notify():隨機喚醒乙個在該物件上等待的執行緒,被喚醒的執行緒進行鎖池,開始競爭該對鎖上的鎖
notifyall():喚醒所有在該物件上等待的執行緒,優先順序高的執行緒有可能先競爭到,物件鎖只能在同步方法和同步**塊中使用。
簡單的例子:
//建立饅頭物件
class mantou
}
接下來建立緩衝區筐
//建立筐
class syncstack catch (interruptedexception e)
// 喚醒當前物件等待池中的第乙個等待執行緒
} this.notify();
ms[index] = m;
index++;
} // 建立取饅頭的鎖
public synchronized mantou pop() catch (interruptedexception e)
} this.notify();
index--;
return ms[index];
}}
建立生產者
class producter extends thread
@override
public void run()
}}
建立消費者
class consumer extends thread
@override
public void run()
}}
編寫測試類
public class test1
}
總結:一定要注意自己加的index來判斷資料倉儲是否存滿的設定,或者也可以設定乙個布林型別變數來判斷。加在while迴圈中以防止早期通知,或者遺漏通知。 生產者消費者
using system using system.collections.generic using system.threading namespace gmservice foreach thread thread in producers q.exit console.read public...
生產者消費者
執行緒通訊 乙個執行緒完成了自己的任務時,要通知另外乙個執行緒去完成另外乙個任務.wait 等待 如果執行緒執行了wait方法,那麼該執行緒會進入等待的狀態,等待狀態下的執行緒必須要被其他執行緒呼叫notify方法才能喚醒。notify 喚醒 喚醒執行緒池等待執行緒其中的乙個。notifyall 喚...
生產者消費者
生產者和消費者是一種經典的供求案例,生產者和消費者執行緒之間的關係涉及執行緒之間的互動。生產者執行緒產生的資料項,將來會被消費者消費,每個生產出來的資料會被儲存在乙個共享的倉庫中。假設執行緒以不同的速度進行,那麼將會導致消費者可能獲取到還未生產的資料,生產者也有可能在消費者還未取走前一條資料的前提下...