日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

生产者消费者案例

發布時間:2024/3/12 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 生产者消费者案例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 前言
  • 一、案例描述
  • 二、創建快遞柜
  • 三、創建生產者類
  • 四、創建消費者類
  • 五、測試類
  • 總結


前言

生產者消費者模式屬于一種經典的多線程協作的模式,弄清生產者消費者問題能夠讓我們對于多線程編程有更深刻的理解,下面,為大家分享一個生產者消費者的案例。


一、案例描述

這里以快遞為例,假設有一個快遞柜,用來存快遞,然后有快遞員和取件人,快遞員往快遞柜里存快遞,取件人從快遞柜中取走快遞。快遞員作為生產者,取件人作為消費者,當兩者在一個時間段同時進行多次自己的操作時,很明顯這就是多線程編程的生產者消費者實例了。在這里,我們希望快遞員(生產者)存入一個快遞,取件人(消費者)就拿走一個快遞,如果快遞還沒有被取走,那么生產者應該等待,而如果快遞柜里沒有快遞,則消費者應該等待。

首先來明確一下,這個案例我們需要準備:

  • 快遞柜類(Box):包含一個成員變量,表示快遞的序號,并提供存快遞和取快遞的操作方法
  • 生產者類(Producer):實現Runnable接口,包含存快遞的方法
  • 消費者類(Customer):實現Runnable接口,包含取快遞的方法
  • 測試類(BoxDemo):測試類按如下步驟實現這個案例
    (1) 創建快遞柜對象作為共享數據區域
    (2) 創建生產者,把快遞柜對象作為參數傳遞至構造方法,因為生產者需要完成存快遞的操作
    (3)創建消費者,把快遞柜作為對象傳遞至構造方法,因為消費者需要完成取快遞的操作
    (4)創建兩個線程,將生產者和消費者對象分別作為參數傳遞至線程的構造方法,然后啟動線程
  • 下面是具體實現:

    二、創建快遞柜

    代碼如下:

    public class Box {//定義成員變量表示第幾個快遞(快遞序號)private int express;//定義一個成員變量用于表示快遞柜的狀態private boolean flag = false;//存快遞public synchronized void put(int express) {//如果有快遞,那么快遞員應該等待取件人來取快遞if (flag) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}//如果沒有快遞,那么快遞員就存入快遞this.express = express;System.out.println("快遞員將第" + this.express + "個快遞存入了快遞柜");//別忘了存完修改快遞柜的狀態flag = true;//修改完快遞柜狀態后,喚醒其他在等待的線程notifyAll();}//取快遞public synchronized void get() {//如果有快遞,那么取件人就取走快遞if (flag) {System.out.println("取件人取出了第" + this.express + "個快遞");flag = false;notifyAll();} else {//沒有快遞,那么取件人就等待try {wait();} catch (InterruptedException e) {e.printStackTrace();}}} }

    說明:

    如之前的分析,我們創建了一個Box類當做快遞柜,除了表示快遞序號的成員變量以外和對應的存快遞、取快遞方法外,還包括一個用來標記快遞柜狀態的變量,因為線程執行時需要這個標記來判斷是該執行還是等待。存快遞和取快遞的方法都加上了sychronized變成了同步方法,因為用于等待的wait()方法和喚醒的notifyAll()方法要在sychronized塊中使用,否則會拋出 IllegalMonitorStateException異常而無法執行。

    三、創建生產者類

    代碼如下:

    public class Producer implements Runnable{private Box b;public Producer(Box b){this.b = b;}@Overridepublic void run() {for(int i = 1 ;i<11;i++){b.put(i);}} }

    說明:

    快遞員當做生產者類,它實現了Runnable接口,重寫了run()方法,并且有一個Box類型的成員變量,和一個以這個成員變量為參數的構造方法,因為在這個類中要調用存快遞的操作。在這里,run()方法里一共存入了10次快遞。

    四、創建消費者類

    代碼如下:

    public class Customer implements Runnable{private Box b ;public Customer(Box b){this.b = b;}@Overridepublic void run() {while(true){b.get();}} }

    說明:

    同生產者類一樣,消費者(取件人)類也實現了Runnable接口,重寫了run()方法,同樣有一個Box類型的成員變量,和一個以這個成員變量為參數的構造方法,因為這個類里會調用取快遞的操作。由于能取快遞的次數是由生產者(快遞員)存入多少快遞決定的,所以這里我們直接用while循環就好了。

    五、測試類

    在測試類中,我們分別創建快遞柜、生產者和消費者的對象,將快遞柜對象作為參數分別傳入生產者和消費者創建時的構造方法。然后創建兩個線程,分別將生產者和消費者對象作為構造方法的參數傳遞,最后啟動線程,觀察結果。

    代碼如下:

    public class BoxDemo {public static void main(String[] args) {//創建快遞柜對象Box box = new Box();//創建生產者和消費者對象Producer p = new Producer(box);Customer c = new Customer(box);//創建兩個線程Thread t1 = new Thread(p,"生產者線程");Thread t2 = new Thread(c,"消費者線程");//啟動線程t1.start();t2.start();} }

    執行結果:

    可以看到,快遞員和取件人有序地完成了10個快遞的存和取。


    總結

    以上就是一個簡單的生產者和消費者的案例,從這里面我們可以看出,這種模式除了生產者、消費者以外,還有一個很重要的中介的數據緩存區,也就是案例中的快遞柜,生產者往里面“丟”,消費者從里面“拿”,這樣三者才構成了完整的生產者消費者模式。


    總結

    以上是生活随笔為你收集整理的生产者消费者案例的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 农村老妇性真猛 | 欧美在线日韩在线 | 午夜黄网 | 美女精品 | 亚洲一二三区在线观看 | 久久网站视频 | 色婷婷九月 | 欧美性生话 | av老司机在线观看 | 天天射夜夜 | 国产麻豆a毛片 | www一区二区三区 | 日韩精品极品视频免费观看 | 丝袜诱惑一区二区 | 手机在线看片你懂的 | 欧美v亚洲 | 婷婷的五月天 | 在线播放黄色av | 九月丁香婷婷 | www久久99| 久久精品国产久精国产 | 天堂在线视频tv | 精品久久久久久久久久久久久 | 免费黄色网址在线观看 | 亚洲综合五区 | 青青草伊人 | 六月丁香激情网 | 91精品国产欧美一区二区 | 日韩激情图片 | 人妻少妇一区二区三区 | 亚洲成人免费看 | 国产1区2区 | 一区二区国产在线 | 男人和女人插插 | 成人美女免费网站视频 | 国产精品三级在线观看无码 | 欧洲自拍偷拍 | 成人欧美一区二区三区黑人一 | 亚洲欧美制服丝袜 | 天堂99| 四虎4hu永久免费网站影院 | 影音先锋在线观看视频 | 女同性恋一区二区三区 | 成人在线短视频 | 久久精品免费网站 | 亚洲一区中文字幕 | 日日夜夜中文字幕 | 国产精品99久久久精品无码 | 巨大黑人极品videos精品 | 成人高清视频在线观看 | 麻豆成人精品 | 久久久精品免费视频 | 男人天堂a在线 | 久久男女| 中文婷婷 | 夜色成人 | 欧美偷拍一区二区三区 | 九一九色国产 | 美女撒尿无遮挡网站 | 人成免费在线视频 | 青青草视频在线观看 | 蜜臀精品| 人妖一区二区三区 | 精品人妻一区二区三区久久嗨 | 用力挺进新婚白嫩少妇 | 九九国产 | 欧美一区二区区 | 麻豆乱淫一区二区三区 | 开心激情亚洲 | 性欧美ⅹxxxx极品护士 | 国内性视频 | 日韩毛片一区二区三区 | 国产精品无码天天爽视频 | 国内自拍欧美 | 小说肉肉视频 | 精品免费在线 | 四虎在线影院 | 99久久影视| 无码精品人妻一区二区 | 国产精品免费91 | 91亚洲精品久久久蜜桃借种 | 成人日韩在线观看 | 粉嫩一区二区三区 | 成人精品三级 | 欧美人体一区二区三区 | 精品视频91 | 亚洲一区二区黄片 | 蜜臀av色欲a片无码精品一区 | 嫩草影院黄 | 女教师高潮黄又色视频 | 99色99 | 国产精品久久久久久久一区二区 | 手机av在线不卡 | 欧美mv日韩mv国产网站app | 日韩中文字幕网 | 一区二区网站 | 欧美r级在线观看 | 天天看天天摸天天操 | 91福利视频免费观看 |