最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2015年07月30日 10:43:48   作者:低調(diào)小一  
這篇文章主要介紹了Java并發(fā)編程中的生產(chǎn)者與消費者模型簡述,多線程并發(fā)是Java編程中最終要的部分之一,需要的朋友可以參考下

概述
對于多線程程序來說,生產(chǎn)者和消費者模型是非常經(jīng)典的模型。更加準(zhǔn)確的說,應(yī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)判斷當(dāng)前倉庫狀態(tài)是否為空,空的話則消費線程需要wait,釋放鎖允許其他同步方法執(zhí)行。
4.  倉庫為滿時,生產(chǎn)者不能繼續(xù)生產(chǎn),生產(chǎn)者生產(chǎn)錢需要循環(huán)判斷當(dāng)前倉庫狀態(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(); 
      } 
    } 
  } 

相關(guān)文章

  • 詳解SpringBoot依賴注入和使用配置文件

    詳解SpringBoot依賴注入和使用配置文件

    這篇文章主要介紹了SpringBoot依賴注入和使用配置文件的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • Java C++題解leetcode 1684統(tǒng)計一致字符串的數(shù)目示例

    Java C++題解leetcode 1684統(tǒng)計一致字符串的數(shù)目示例

    這篇文章主要為大家介紹了Java C++題解leetcode 1684統(tǒng)計一致字符串的數(shù)目示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 基于Java制作一個燈謎猜猜樂游戲

    基于Java制作一個燈謎猜猜樂游戲

    中秋佳節(jié),是我國傳統(tǒng)的重大節(jié)日之一,全國各地為了增強過節(jié)的氣氛,都有許多傳統(tǒng)的中秋活動,比如猜燈謎,所以本文就來用Java制作一個燈謎猜猜樂游戲,感興趣的可以了解下
    2023-09-09
  • 深入了解Java Object類的使用

    深入了解Java Object類的使用

    java繼承中說到的Object類是java中一個特殊的類,所有的類都是直接或者間接的繼承自O(shè)bject類。本文就和大家詳細講講Java Object類的使用,感興趣的可以了解一下
    2022-07-07
  • Java實現(xiàn)自動壓縮文件并加密的方法示例

    Java實現(xiàn)自動壓縮文件并加密的方法示例

    這篇文章主要介紹了Java實現(xiàn)自動壓縮文件并加密的方法,涉及java針對文件進行zip壓縮并加密的相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • Java整合mybatis實現(xiàn)過濾數(shù)據(jù)

    Java整合mybatis實現(xiàn)過濾數(shù)據(jù)

    這篇文章主要介紹了Java整合mybatis實現(xiàn)過濾數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-01-01
  • Java生成二維碼的兩種實現(xiàn)方式(基于Spring?Boot)

    Java生成二維碼的兩種實現(xiàn)方式(基于Spring?Boot)

    這篇文章主要給大家介紹了關(guān)于Java生成二維碼的兩種實現(xiàn)方式,文中的代碼基于Spring?Boot,本文基于JAVA環(huán)境,以SpringBoot框架為基礎(chǔ)開發(fā),文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • 如何使用java寫Student類的功能

    如何使用java寫Student類的功能

    這篇文章主要介紹了如何使用java寫Student類的功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • SpringBoot使用注解集成Redis緩存的示例代碼

    SpringBoot使用注解集成Redis緩存的示例代碼

    這篇文章主要介紹了在?Spring?Boot?中使用注解集成?Redis?緩存的步驟,包括添加依賴、創(chuàng)建相關(guān)配置類、需要緩存數(shù)據(jù)的類(TestService)以及測試方法(如在?Controller?中的?redisTest?和?redisCache?方法),還對一些關(guān)鍵代碼和配置進行了詳細說明
    2025-01-01
  • Java 枚舉類和自定義枚舉類和enum聲明及實現(xiàn)接口的操作

    Java 枚舉類和自定義枚舉類和enum聲明及實現(xiàn)接口的操作

    這篇文章主要介紹了Java 枚舉類和自定義枚舉類和enum聲明及實現(xiàn)接口的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02

最新評論

双桥区| 靖州| 澄城县| 新密市| 贵德县| 镇巴县| 白沙| 纳雍县| 通道| 包头市| 蕉岭县| 贵州省| 宜兰市| 拜城县| 铜梁县| 丰顺县| 孝昌县| 右玉县| 全椒县| 河东区| 苏尼特左旗| 渝中区| 侯马市| 兴海县| 宜春市| 府谷县| 惠州市| 调兵山市| 嵩明县| 白水县| 桦南县| 康马县| 安化县| 东乡| 巫山县| 呼图壁县| 德兴市| 永州市| 抚宁县| 富民县| 乐昌市|