這篇文章主要講解了“Java多線程中消費者生產(chǎn)者模式怎么實現(xiàn)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java多線程中消費者生產(chǎn)者模式怎么實現(xiàn)”吧!
瀾滄網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,瀾滄網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為瀾滄上1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的瀾滄做網(wǎng)站的公司定做!
/*@author shijin * 生產(chǎn)者與消費者模型中,要保證以下幾點: * 1 同一時間內(nèi)只能有一個生產(chǎn)者生產(chǎn) 生產(chǎn)方法加鎖sychronized * 2 同一時間內(nèi)只能有一個消費者消費 消費方法加鎖sychronized * 3 生產(chǎn)者生產(chǎn)的同時消費者不能消費 生產(chǎn)方法加鎖sychronized * 4 消費者消費的同時生產(chǎn)者不能生產(chǎn) 消費方法加鎖sychronized * 5 共享空間空時消費者不能繼續(xù)消費 消費前循環(huán)判斷是否為空,空的話將該線程wait,釋放鎖允許其他同步方法執(zhí)行 * 6 共享空間滿時生產(chǎn)者不能繼續(xù)生產(chǎn) 生產(chǎn)前循環(huán)判斷是否為滿,滿的話將該線程wait,釋放鎖允許其他同步方法執(zhí)行 */ //主類 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; } } //共享??臻g class StackBasket { Mantou sm[] = new Mantou[6]; int index = 0; /** * show 生產(chǎn)方法. * show 該方法為同步方法,持有方法鎖; * show 首先循環(huán)判斷滿否,滿的話使該線程等待,釋放同步方法鎖,允許消費; * show 當(dāng)不滿時首先喚醒正在等待的消費方法,但是也只能讓其進入就緒狀態(tài), * show 等生產(chǎn)結(jié)束釋放同步方法鎖后消費才能持有該鎖進行消費 * @param m 元素 * @return 沒有返回值 */ public synchronized void push(Mantou m){ try{ while(index == sm.length){ System.out.println("!!!!!!!!!生產(chǎn)滿了!!!!!!!!!"); this.wait(); } this.notify(); }catch(InterruptedException e){ e.printStackTrace(); }catch(IllegalMonitorStateException e){ e.printStackTrace(); } sm[index] = m; index++; System.out.println("生產(chǎn)了:" + m + " 共" + index + "個饅頭"); } /** * show 消費方法 * show 該方法為同步方法,持有方法鎖 * show 首先循環(huán)判斷空否,空的話使該線程等待,釋放同步方法鎖,允許生產(chǎn); * show 當(dāng)不空時首先喚醒正在等待的生產(chǎn)方法,但是也只能讓其進入就緒狀態(tài) * show 等消費結(jié)束釋放同步方法鎖后生產(chǎn)才能持有該鎖進行生產(chǎn) * @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 生產(chǎn)進程. */ public void run(){ for(int i = 0;i < 20;i++){ Mantou m = new Mantou(i); ss.push(m); // System.out.println("生產(chǎn)了:" + m + " 共" + ss.index + "個饅頭"); // 在上面一行進行測試是不妥的,對index的訪問應(yīng)該在原子操作里,因為可能在push之后此輸出之前又消費了,會產(chǎn)生輸出混亂 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的訪問應(yīng)該在原子操作里,因為可能在pop之后此輸出之前又生產(chǎn)了,會產(chǎn)生輸出混亂 try{ Thread.sleep((int)(Math.random()*1000)); }catch(InterruptedException e){ e.printStackTrace(); } } } }
感謝各位的閱讀,以上就是“Java多線程中消費者生產(chǎn)者模式怎么實現(xiàn)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java多線程中消費者生產(chǎn)者模式怎么實現(xiàn)這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
網(wǎng)頁標(biāo)題:Java多線程中消費者生產(chǎn)者模式怎么實現(xiàn)
轉(zhuǎn)載源于:http://bm7419.com/article10/gosego.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計、外貿(mào)建站、自適應(yīng)網(wǎng)站、網(wǎng)站內(nèi)鏈、移動網(wǎng)站建設(shè)、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)