国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java并發(fā)編程中的生產(chǎn)者與消費者模型簡述

2019-11-26 15:02:50
字體:
供稿:網(wǎng)友

概述
對于多線程程序來說,生產(chǎn)者和消費者模型是非常經(jīng)典的模型。更加準確的說,應該叫“生產(chǎn)者-消費者-倉庫模型”。離開了倉庫,生產(chǎn)者、消費者就缺少了共用的存儲空間,也就不存在并非協(xié)作的問題了。

示例
定義一個場景。一個倉庫只允許存放10件商品,生產(chǎn)者每次可以向其中放入一個商品,消費者可以每次從其中取出一個商品。同時,需要注意以下4點:
1.  同一時間內(nèi)只能有一個生產(chǎn)者生產(chǎn),生產(chǎn)方法需要加鎖synchronized。
2.  同一時間內(nèi)只能有一個消費者消費,消費方法需要加鎖synchronized。
3.  倉庫為空時,消費者不能繼續(xù)消費。消費者消費前需要循環(huán)判斷當前倉庫狀態(tài)是否為空,空的話則消費線程需要wait,釋放鎖允許其他同步方法執(zhí)行。
4.  倉庫為滿時,生產(chǎn)者不能繼續(xù)生產(chǎn),生產(chǎn)者生產(chǎn)錢需要循環(huán)判斷當前倉庫狀態(tài)是否為滿,滿的話則生產(chǎn)線程需要wait,釋放鎖允許其他同步方法執(zhí)行。

示例代碼如下:

  

 public class Concurrence {     public static void main(String[] args) {       WareHouse wareHouse = new WareHouse();       Producer producer = new Producer(wareHouse);       Consumer consumer = new Consumer(wareHouse);          new Thread(producer).start();       new Thread(consumer).start();     }   }      class WareHouse {     private static final int STORE_SIZE = 10;     private String[] storeProducts = new String[STORE_SIZE];     private int index = 0;        public void pushProduct(String product) {       synchronized (this) {         while (index == STORE_SIZE) {           try {             this.wait();           } catch (InterruptedException e) {             e.printStackTrace();           }         }            storeProducts[index++] = product;         this.notify();            System.out.println("生產(chǎn)了: " + product + " , 目前倉庫里共: " + index             + " 個貨物");       }     }        public synchronized String getProduct() {       synchronized (this) {         while (index == 0) {           try {             this.wait();           } catch (InterruptedException e) {             e.printStackTrace();           }         }            String product = storeProducts[index - 1];         index--;         System.out.println("消費了: " + product + ", 目前倉庫里共: " + index             + " 個貨物");         this.notify();         return product;       }     }   }      class Producer implements Runnable {     WareHouse wareHouse;        public Producer(WareHouse wh) {       this.wareHouse = wh;     }        @Override     public void run() {       for (int i = 0; i < 40; i++) {         String product = "product" + i;         this.wareHouse.pushProduct(product);       }     }   }      class Consumer implements Runnable {     WareHouse wareHouse;        public Consumer(WareHouse wh) {       this.wareHouse = wh;     }        @Override     public void run() {       for (int i = 0; i < 40; i++) {         this.wareHouse.getProduct();       }     }   } 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 洛川县| 兰坪| 沧源| 日喀则市| 涞水县| 广德县| 奈曼旗| 商水县| 广安市| 富顺县| 确山县| 襄汾县| 常宁市| 龙南县| 巴林左旗| 定兴县| 望江县| 特克斯县| 屯门区| 盘山县| 卢氏县| 永宁县| 莲花县| 西安市| 琼结县| 荃湾区| 南木林县| 兴安盟| 本溪市| 金平| 北海市| 普兰店市| 固阳县| 巴彦淖尔市| 大兴区| 西峡县| 乌鲁木齐市| 桐柏县| 得荣县| 葵青区| 密云县|