您好,登錄后才能下訂單哦!
這篇文章主要介紹“java實現生產者消費者的實例代碼”,在日常操作中,相信很多人在java實現生產者消費者的實例代碼問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”java實現生產者消費者的實例代碼”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
if只會判斷一次,而while一直會判斷
永遠要使用notifyAll不要使用notify。
public class MyContainer1<T> { final private LinkedList<T> lists = new LinkedList<>(); final private int MAX = 10; //最多10個元素 private int count = 0; //當前有多少個 public synchronized void put(T t) { while(lists.size() == MAX) { //想想為什么用while而不是用if? try { this.wait(); //effective java } catch (InterruptedException e) { e.printStackTrace(); } } lists.add(t); ++count; this.notifyAll(); //通知消費者線程進行消費 } public synchronized T get() { T t = null; while(lists.size() == 0) { try { this.wait(); //effective java } catch (InterruptedException e) { e.printStackTrace(); } } t = lists.removeFirst(); count --; this.notifyAll(); //通知生產者進行生產 return t; } public static void main(String[] args) { MyContainer1<String> c = new MyContainer1<>(); //啟動消費者線程 for(int i=0; i<10; i++) { new Thread(()->{ for(int j=0; j<5; j++) System.out.println(c.get()); }, "c" + i).start(); } try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } //啟動生產者線程 for(int i=0; i<2; i++) { new Thread(()->{ for(int j=0; j<25; j++) c.put(Thread.currentThread().getName() + " " + j); }, "p" + i).start(); } } }
到此,關于“java實現生產者消費者的實例代碼”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。