Java中设计模式之生产者消费者模式-3
引言
生產(chǎn)者-消費(fèi)者(producer-consumer)問(wèn)題,也稱作有界緩沖區(qū)(bounded-buffer)問(wèn)題,兩個(gè)進(jìn)程共享一個(gè)公共的固定大小的緩沖區(qū)。其中一個(gè)是生產(chǎn)者,用于將消息放入緩沖區(qū);另外一個(gè)是消費(fèi)者,用于從緩沖區(qū)中取出消息。問(wèn)題出現(xiàn)在當(dāng)緩沖區(qū)已經(jīng)滿了,而此時(shí)生產(chǎn)者還想向其中放入一個(gè)新的數(shù)據(jù)項(xiàng)的情形,其解決方法是讓生產(chǎn)者此時(shí)進(jìn)行休眠,等待消費(fèi)者從緩沖區(qū)中取走了一個(gè)或者多個(gè)數(shù)據(jù)后再去喚醒它。同樣地,當(dāng)緩沖區(qū)已經(jīng)空了,而消費(fèi)者還想去取消息,此時(shí)也可以讓消費(fèi)者進(jìn)行休眠,等待生產(chǎn)者放入一個(gè)或者多個(gè)數(shù)據(jù)時(shí)再喚醒它。
生產(chǎn)者消費(fèi)者模型
四個(gè)類
1.產(chǎn)品類:面包,飲料等
2.資源類(中介類):超市(買賣各種產(chǎn)品)
3.生產(chǎn)類(工廠類):生產(chǎn)各種產(chǎn)品
4.消費(fèi)者類(顧客類):消費(fèi)各種產(chǎn)品
代碼:
1.產(chǎn)品類
package 設(shè)計(jì)模式之生產(chǎn)者消費(fèi)者模式;public class Bread {private String brand;private double price;public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}@Overridepublic String toString() {return "Bread [brand=" + brand + ", price=" + price + "]";}public Bread(String brand, double price) {super();this.brand = brand;this.price = price;}public Bread() {super();}}2.中介類(資源類):超市
負(fù)責(zé)統(tǒng)籌安排所有資源,是生產(chǎn)者和消費(fèi)者的橋梁。類似多線程中的共享資源,各個(gè)線程來(lái)操作同一個(gè)資源。
package 設(shè)計(jì)模式之生產(chǎn)者消費(fèi)者模式;public class Market { //假設(shè)超市買面包的容量為6(即面包貨架容量為6)private Bread[] breads=new Bread[6];int index=-1;// 為什么不默認(rèn)為0 因?yàn)閿?shù)組下標(biāo)為0 是有一個(gè)數(shù)據(jù)的//從工廠進(jìn)面包public synchronized void getBread(Bread bread){//如果昨天生意不好,沒(méi)有賣出面包,此時(shí)就不需要進(jìn)貨if(index>=5){// 下標(biāo)如果大于等于5 那就是有6個(gè)面包 工廠不需要生產(chǎn) 所以讓工廠等著try {this.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//生意很好,賣出了面包,需要進(jìn)貨// 為了不覆蓋任何面包 需要先加 下標(biāo) 后賦值index++;//將進(jìn)的面包放進(jìn)數(shù)組里(貨架上)breads[index]=bread;System.out.println("進(jìn)了"+breads[index]);//進(jìn)貨后,(通知)讓顧客消費(fèi)this.notify();}// 賣面包public synchronized void saleBread(){//如果昨天生意很好,面包已經(jīng)賣完了,那么顧客就需要等待if(index<0){// 下標(biāo)小于0 就證明是 數(shù)組中沒(méi)有面包了 ,就讓消費(fèi)者等待try {this.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//有面包可以賣// 賣了哪個(gè)面包System.out.println("[賣了]"+breads[index]);// 賣完面包 下標(biāo)自動(dòng)減-index--;this.notify();}}3.工廠類
package 設(shè)計(jì)模式之生產(chǎn)者消費(fèi)者模式;public class Factory implements Runnable {Market market;public Factory(Market market) {super();this.market = market;}@Overridepublic void run() {for(int i=0;i<80;i++){market.getBread(new Bread("桃李牌"+i, 4.5));}} }4.消費(fèi)者
package 設(shè)計(jì)模式之生產(chǎn)者消費(fèi)者模式;public class Customer implements Runnable {Market market;public Customer(Market market){this.market=market;}@Overridepublic void run() {for(int i=0;i<80;i++){market.saleBread();}}}測(cè)試類
package 設(shè)計(jì)模式之生產(chǎn)者消費(fèi)者模式;public class Test {public static void main(String[] args){Market market=new Market();Factory factory=new Factory(market);Customer customer=new Customer(market);Thread thread=new Thread(factory,"生產(chǎn)者");Thread thread2=new Thread(customer,"消費(fèi)者");thread.start();thread2.start();} }總結(jié)
以上是生活随笔為你收集整理的Java中设计模式之生产者消费者模式-3的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java中设计模式之装饰者模式-2
- 下一篇: Java中设计模式之工厂模式-4