<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
問題:
1.什麼是阻塞佇列?如何使用阻塞佇列來實現生產者-消費者模型?
2. 生產者消費者模型的作用是什麼?
在生產者-消費者模式中,通常有兩類執行緒,即生產者執行緒(若干個)和消費者執行緒(若干個)。生產者執行緒向訊息佇列加入資料,消費者執行緒則從訊息佇列消耗資料。生產者和消費者、訊息佇列之間的關係結構圖如圖:
(1) 訊息佇列可以用來平衡生產和消費的執行緒資源;
(2) 生產者僅負責產生結果資料,不關心資料該如何處理,而消費者專心處理結果資料 ;
(3) 訊息佇列是有容量限制的,訊息佇列滿後,生產者不能再加入資料;訊息佇列空時,消費者不能再取出資料;
(4) 訊息佇列是執行緒安全的,在並行操作訊息佇列的過程中,不能出現資料不一致的情況;或者在多個執行緒並行更改共用資料後,不會造成出現髒資料的情況;
(5) JDK 中各種阻塞佇列,採用的就是這種模式;
1、訊息佇列中存放的訊息類:
/** * 訊息佇列中存放的訊息類 */ final public class Message { private int id; private int value; public Message(int id,int value){ this.id = id; this.value = value; } public int getId() { return id; } public int getValue() { return value; } }
2、實現阻塞佇列(訊息佇列) :
import lombok.extern.slf4j.Slf4j; import java.util.LinkedList; /** * 實現一個阻塞佇列(訊息佇列),實現java執行緒間通訊 */ @Slf4j public class MessageQueue { // 訊息佇列的容量 private int capacity; // 訊息佇列 LinkedList<Message> messageQueue = new LinkedList<>(); // 設定訊息佇列的容量 public MessageQueue(int capacity){ this.capacity = capacity; } // 從訊息佇列中取訊息 public Message take(){ synchronized (messageQueue){ // 如果訊息佇列為空 while (messageQueue.isEmpty()){ try { log.debug("佇列為空, 消費者執行緒等待"); messageQueue.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } Message message = messageQueue.removeFirst(); log.debug("已消費訊息 {}", message); // 走到這,說明訊息佇列不為null messageQueue.notifyAll(); return message; } } // 往訊息佇列中放訊息 public void put(Message message){ synchronized (messageQueue){ // 如果訊息佇列已滿 while (messageQueue.size()==capacity){ try { log.debug("佇列已滿, 生產者執行緒等待"); messageQueue.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } messageQueue.addLast(message); log.debug("已生產訊息 {}", message); // 走到這,說明訊息佇列不滿 messageQueue.notifyAll(); } } }
3、測試:
public class Main { public static void main(String[] args) { MessageQueue queue = new MessageQueue(2); for(int i=0;i<3;i++){ int id = i; new Thread(()->{ queue.put(new Message(id,id)); },"生產者").start(); } new Thread(()->{ while (true){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } Message message = queue.take(); } },"消費者").start(); } }
執行結果:
15:31:28.488 [生產者] DEBUG com.example.test.MessageQueue - 已生產訊息 com.example.test.Message@54309a75
15:31:28.507 [生產者] DEBUG com.example.test.MessageQueue - 已生產訊息 com.example.test.Message@50915389
15:31:28.507 [生產者] DEBUG com.example.test.MessageQueue - 佇列已滿, 生產者執行緒等待
15:31:29.486 [消費者] DEBUG com.example.test.MessageQueue - 已消費訊息 com.example.test.Message@54309a75
15:31:29.486 [生產者] DEBUG com.example.test.MessageQueue - 已生產訊息 com.example.test.Message@6340ac12
15:31:30.487 [消費者] DEBUG com.example.test.MessageQueue - 已消費訊息 com.example.test.Message@50915389
15:31:31.487 [消費者] DEBUG com.example.test.MessageQueue - 已消費訊息 com.example.test.Message@6340ac12
15:31:32.488 [消費者] DEBUG com.example.test.MessageQueue - 佇列為空, 消費者執行緒等待
(1) 通過平衡生產者的生產能力和消費者的消費能力來提升整個系統的執行效率 ;
(2) 解耦,解耦意味著生產者和消費者之間的聯絡少,聯絡越少越可以獨自發展而不需要收到相互的制約;
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注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