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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java多线程之消费者生产者模式

發布時間:2025/3/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java多线程之消费者生产者模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • /*@author?shijin?
  • *?生產者與消費者模型中,要保證以下幾點:?
  • *?1?同一時間內只能有一個生產者生產?????生產方法加鎖sychronized?
  • *?2?同一時間內只能有一個消費者消費?????消費方法加鎖sychronized?
  • *?3?生產者生產的同時消費者不能消費?????生產方法加鎖sychronized?
  • *?4?消費者消費的同時生產者不能生產?????消費方法加鎖sychronized?
  • *?5?共享空間空時消費者不能繼續消費?????消費前循環判斷是否為空,空的話將該線程wait,釋放鎖允許其他同步方法執行?
  • *?6?共享空間滿時生產者不能繼續生產?????生產前循環判斷是否為滿,滿的話將該線程wait,釋放鎖允許其他同步方法執行????
  • */??
  • ??
  • //主類 ??
  • class??ProducerConsumer??
  • {??
  • ????public?static?void?main(String[]?args)???
  • ????{??
  • ????????StackBasket?s?=?new?StackBasket();??
  • ????????Producer?p?=?new?Producer(s);??
  • ????????Consumer?c?=?new?Consumer(s);??
  • ????????Thread?tp?=?new?Thread(p);??
  • ????????Thread?tc?=?new?Thread(c);??
  • ????????tp.start();??
  • ????????tc.start();??
  • ????}??
  • }??
  • ??
  • // ??
  • class?Mantou??
  • {??
  • ????private?int?id;??
  • ??????
  • ????Mantou(int?id){??
  • ????????this.id?=?id;??
  • ????}??
  • ??
  • ????public?String?toString(){??
  • ????????return?"Mantou?:"?+?id;??
  • ????}??
  • }??
  • ??
  • //共享棧空間 ??
  • class?StackBasket??
  • {??
  • ????Mantou?sm[]?=?new?Mantou[6];??
  • ????int?index?=?0;??
  • ??????
  • ????/**??
  • ????*?show?生產方法.?
  • ????*?show?該方法為同步方法,持有方法鎖;?
  • ????*?show?首先循環判斷滿否,滿的話使該線程等待,釋放同步方法鎖,允許消費;?
  • ????*?show?當不滿時首先喚醒正在等待的消費方法,但是也只能讓其進入就緒狀態,?
  • ????*?show?等生產結束釋放同步方法鎖后消費才能持有該鎖進行消費?
  • ????*?@param?m?元素?
  • ????*?@return?沒有返回值??
  • ????*/???
  • ??
  • ????public?synchronized?void?push(Mantou?m){??
  • ????????try{??
  • ????????????while(index?==?sm.length){??
  • ????????????????System.out.println("!!!!!!!!!生產滿了!!!!!!!!!");??
  • ????????????????this.wait();??
  • ????????????}??
  • ????????????this.notify();??
  • ????????}catch(InterruptedException?e){??
  • ????????????e.printStackTrace();??
  • ????????}catch(IllegalMonitorStateException?e){??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ??????????
  • ????????sm[index]?=?m;??
  • ????????index++;??
  • ????????System.out.println("生產了:"?+?m?+?"?共"?+?index?+?"個饅頭");??
  • ????}??
  • ??
  • ????/**??
  • ????*?show?消費方法?
  • ????*?show?該方法為同步方法,持有方法鎖?
  • ????*?show?首先循環判斷空否,空的話使該線程等待,釋放同步方法鎖,允許生產;?
  • ????*?show?當不空時首先喚醒正在等待的生產方法,但是也只能讓其進入就緒狀態?
  • ????*?show?等消費結束釋放同步方法鎖后生產才能持有該鎖進行生產?
  • ????*?@param?b?true?表示顯示,false?表示隱藏??
  • ????*?@return?沒有返回值??
  • ????*/???
  • ????public?synchronized?Mantou?pop(){??
  • ????????try{??
  • ????????????while(index?==?0){??
  • ????????????????System.out.println("!!!!!!!!!消費光了!!!!!!!!!");??
  • ????????????????this.wait();??
  • ????????????}??
  • ????????????this.notify();??
  • ????????}catch(InterruptedException?e){??
  • ????????????e.printStackTrace();??
  • ????????}catch(IllegalMonitorStateException?e){??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ????????index--;??
  • ????????System.out.println("消費了:---------"?+?sm[index]?+?"?共"?+?index?+?"個饅頭");??
  • ????????return?sm[index];??
  • ????}??
  • }??
  • ??
  • class?Producer?implements?Runnable??
  • {??
  • ????StackBasket?ss?=?new?StackBasket();??
  • ????Producer(StackBasket?ss){??
  • ????????this.ss?=?ss;??
  • ????}??
  • ??
  • ????/**??
  • ????*?show?生產進程.??
  • ????*/???
  • ????public?void?run(){??
  • ????????for(int?i?=?0;i?<?20;i++){??
  • ????????????Mantou?m?=?new?Mantou(i);??
  • ????????????ss.push(m);??
  • //??????????System.out.println("生產了:"?+?m?+?"?共"?+?ss.index?+?"個饅頭"); ??
  • //??????????在上面一行進行測試是不妥的,對index的訪問應該在原子操作里,因為可能在push之后此輸出之前又消費了,會產生輸出混亂 ??
  • ????????????try{??
  • ????????????????Thread.sleep((int)(Math.random()*500));??
  • ????????????}catch(InterruptedException?e){??
  • ????????????????e.printStackTrace();??
  • ????????????}??
  • ????????}??
  • ????}??
  • }??
  • ??
  • class?Consumer?implements?Runnable??
  • {??
  • ????StackBasket?ss?=?new?StackBasket();??
  • ????Consumer(StackBasket?ss){??
  • ????????this.ss?=?ss;??
  • ????}??
  • ??
  • ????/**??
  • ????*?show?消費進程.?
  • ????*/???
  • ????public?void?run(){??
  • ????????for(int?i?=?0;i?<?20;i++){??
  • ????????????Mantou?m?=?ss.pop();??
  • //??????????System.out.println("消費了:---------"?+?m?+?"?共"?+?ss.index?+?"個饅頭"); ??
  • //??同上??在上面一行進行測試也是不妥的,對index的訪問應該在原子操作里,因為可能在pop之后此輸出之前又生產了,會產生輸出混亂 ??
  • ????????????try{??
  • ????????????????Thread.sleep((int)(Math.random()*1000));??
  • ????????????}catch(InterruptedException?e){??
  • ????????????????e.printStackTrace();??
  • ????????????}??
  • ????????}??
  • ????}??
  • } ?
  • 轉載于:https://www.cnblogs.com/kaikailele/p/4009262.html

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

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

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