<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
假設倉庫中只能存放一件產品,生產者將生產出來的產品放入倉庫,消費者將倉庫中產品取走消費
如果倉庫中沒有產品,則生產者將產品放入倉庫,否則停止生產並等待,直到倉庫中的產品被消費者取走為止
如果倉庫中放有產品,則消費者可以將產品取走消費,否則停止消費並等待,直到倉庫中再次放入產品為止
這是一個執行緒同步問題,生產者和消費者共用同一個資源,並且生產者和消費者之間相互依賴,互為條件。
對於生產者,沒有生產產品之前,要通知消費者等待,而生產了產品之後,又需要馬上通知消費者消費
對於消費者,在消費之後,要通知生產者已經結束消費,需要生產新的產品以供消費
在生產者消費者問題中,僅有synchronized是不夠的
synchronized可阻止並行更新同一個共用資源,實現了同步
synchronized不能用來實現不同執行緒之間的訊息傳遞(通訊)
Java提供了幾個方法解決執行緒之間的通訊問題
方法名 | 作用 |
---|---|
wait() | 表示執行緒一直等待,直到其他執行緒通知,與sleep不同,wait()會釋放鎖 |
wait(long timeout) | 指定等待的毫秒數 |
notify() | 喚醒一個處於等待狀態的執行緒 |
notifyAll() | 喚醒同一個物件上所有呼叫wait()方法的執行緒,優先順序別高的執行緒優先排程 |
注意:均是Object類的方法,都只能在同步方法或者同步程式碼塊中使用,否則會丟擲異常
生產者:負責生產資料的模組(可能是方法、物件、執行緒、程序)
消費者:負責處理資料的模組(可能是方法、物件、執行緒、程序)
緩衝區:消費者不能直接使用生產者的資料,他們之間有個“緩衝區”
生產者將生產好的資料放入緩衝區,消費者從緩衝區拿出資料
程式碼案例
//使用緩衝區解決生產者消費者模型 public class TestPC { public static void main(String[] args) { SynContainer container = new SynContainer(); new Producer(container).start(); new Consumer(container).start(); } } class Producer extends Thread{ SynContainer synContainer; public Producer(SynContainer synContainer){ this.synContainer = synContainer; } // 生產 @Override public void run() { for (int i = 0; i < 100; i++) { synContainer.push(new Chicken(i)); System.out.println("生產了"+i+"只雞"); } } } class Consumer extends Thread{ SynContainer synContainer; public Consumer(SynContainer synContainer){ this.synContainer = synContainer; } // 消費 @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println("消費了-->"+synContainer.pop().id+"只雞"); } } } //產品 class Chicken{ int id; public Chicken(int id) { this.id = id; } } //緩衝區 class SynContainer{ Chicken[] chickens = new Chicken[10]; int count = 0; //生產者放入產品 public synchronized void push(Chicken chicken){ //如果容器滿了就要等到消費者消費 if (count==chickens.length){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } //通知消費者消費,自身進入等待 } //沒有滿的話則生產 chickens[count] = chicken; count++; //通知消費者消費 this.notifyAll(); } //生產者消費產品 public synchronized Chicken pop(){ if (count==0){ //等待生產者生產 try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } count--; Chicken chicken = chickens[count]; //消費了,可以通知生產者繼續生產 this.notifyAll(); return chicken; } }
通過標誌位 true 或者 false 來進行判斷
程式碼案例
//訊號燈法測試生產者消費者模型 即標誌位 public class TestPC2 { public static void main(String[] args) { TV tv = new TV(); new Player(tv).start(); new Audiance(tv).start(); } } //生產者-->演員 class Player extends Thread { TV tv; public Player(TV tv){ this.tv = tv; } @Override public void run() { for (int i = 0; i < 20; i++) { if (i%2==0){ this.tv.play("天天向上"); }else { this.tv.play("抖音廣告"); } } } } //消費者-->觀眾 class Audiance extends Thread{ TV tv; public Audiance(TV tv){ this.tv = tv; } @Override public void run() { for (int i = 0; i < 20; i++) { tv.watch(); } } } //產品-->節目 class TV{ //演員表演 觀眾等待 T //觀眾觀看 演員等待 F String show;//表演的節目 boolean flag = true; //表演 public synchronized void play(String show){ if (!flag){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("演員表演了:"+show); //通知觀眾 this.notifyAll(); this.show = show; this.flag = !this.flag; } //觀看 public synchronized void watch(){ if (flag){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("觀看了"+show); //通知演員表演 this.notifyAll(); this.flag = !this.flag; } }
到此這篇關於java中生產者消費者問題和程式碼案例的文章就介紹到這了,更多相關java生產者消費者問題內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45