中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java多線程中消費者生產者模式怎么實現

發布時間:2022-01-06 22:12:50 來源:億速云 閱讀:124 作者:iii 欄目:編程語言

這篇文章主要講解了“Java多線程中消費者生產者模式怎么實現”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“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();              }          }      }  }

感謝各位的閱讀,以上就是“Java多線程中消費者生產者模式怎么實現”的內容了,經過本文的學習后,相信大家對Java多線程中消費者生產者模式怎么實現這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿克陶县| 普洱| 佛学| 星座| 庄浪县| 改则县| 莒南县| 辛集市| 开远市| 五大连池市| 确山县| 留坝县| 安吉县| 东阿县| 水富县| 阿克苏市| 鄂托克前旗| 江孜县| 深州市| 上栗县| 五台县| 柳河县| 庄河市| 辽中县| 葵青区| 永登县| 图木舒克市| 卓尼县| 剑川县| 闽侯县| 焉耆| 深州市| 晋州市| 平果县| 汪清县| 博客| 淄博市| 宜君县| 西城区| 和林格尔县| 博客|