Java设计模式—生产者消费者模式(阻塞队列实现)

更新时间:2023-07-16 22:40:51 阅读: 评论:0

Java设计模式—⽣产者消费者模式(阻塞队列实现)
不胜感激
⽣产者消费者模式是并发、多线程编程中经典的,⽣产者和消费者通过分离的执⾏⼯作解耦,简化了开发模式,⽣产者和消费者可以以不同的速度⽣产和消费数据。这篇⽂章我们来看看什么是⽣产者消费者模式,这个问题也是多线程⾯试题中经常被提及的。如何使⽤阻塞队列(Blocking Queue)解决⽣产者消费者模式,以及使⽤⽣产者消费者模式的好处。
真实世界中的⽣产者消费者模式
⽣产者和消费者模式在⽣活当中随处可见,它描述的是协调与协作的关系。⽐如⼀个⼈正在准备⾷物(⽣产者),⽽另⼀个⼈正在吃(消费者),他们使⽤⼀个共⽤的桌⼦⽤于放置盘⼦和取⾛盘⼦,⽣产者准备⾷物,如果桌⼦上已经满了就等待,消费者(那个吃的)等待如果桌⼦空了的话。这⾥桌⼦就是⼀个共享的对象。在Java Executor框架⾃⾝实现了⽣产者消费者模式它们分别负责添加和执⾏任务。
⽣产者消费者模式的好处
它的确是⼀种实⽤的设计模式,常⽤于编写多线程或并发代码。下⾯是它的⼀些优点:
1. 它简化的开发,你可以独⽴地或并发的编写消费者和⽣产者,它仅仅只需知道共享对象是谁
2. ⽣产者不需要知道谁是消费者或者有多少消费者,对消费者来说也是⼀样
3. ⽣产者和消费者可以以不同的速度执⾏
4. 分离的消费者和⽣产者在功能上能写出更简洁、可读、易维护的代码
多线程中的⽣产者消费者问题
⽣产者消费者问题是⼀个流⾏的⾯试题,⾯试官会要求你实现⽣产者消费者设计模式,以⾄于能让⽣产者应等待如果队列或篮⼦满了的话,消费者等待如果队列或者篮⼦是空的。这个问题可以⽤不同的⽅式来现实,经典的⽅法是使⽤wait和notify⽅法在⽣产者和消费者线程中合作,在队列满了或者队列是空的条件下阻塞,Java5的阻塞队列(BlockingQueue)数据结构更简单,因为它隐含的提供了这些控制,现在你不需要使⽤wait和nofity在⽣产者和消费者之间通信了,阻塞队列的put()⽅法将阻塞如果队列满了,队列take()⽅法将阻塞如果队列是空的。在下部分我们可以看到代码例⼦。
使⽤阻塞队列实现⽣产者消费者模式
阻塞队列实现⽣产者消费者模式超级简单,它提供开箱即⽤⽀持阻塞的⽅法put()和take(),开发者不需要写困惑的wait-nofity代码去实现通信。BlockingQueue ⼀个接⼝,Java5提供了不同的现实,如ArrayBlockingQueue和LinkedBlockingQueue,两者都是先进先出(FIFO)顺序。⽽ArrayLinkedQueue是⾃然有界的,LinkedBlockingQueue可选的边界。下⾯这是⼀个完整的⽣产者消费者代码例⼦,对⽐传统的wait、nofity代码,它更易于理解。
注意:
使⽤take(),如果队列中没有数据,则线程wait释放CPU,⽽poll()则不会等待,直接返回null;同样,空间耗尽时offer()函数不会等待,直接返回fal,⽽()则会wait,因此如果你使⽤while(true)来获得队列元素,千万别⽤poll(),CPU会100%的.
import urrent.BlockingQueue;
import urrent.LinkedBlockingQueue;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ProducerConsumerPattern {
世界十大钢琴曲public static void main(String args[]){
//Creating shared object
BlockingQueue sharedQueue = new LinkedBlockingQueue();
//Creating Producer and Consumer Thread
妈妈也漂亮
Thread prodThread = new Thread(new Producer(sharedQueue));
属狗属羊是上等婚姻Thread consThread = new Thread(new Consumer(sharedQueue));
//Starting producer and Consumer thread
prodThread.start();
眼部保健操
consThread.start();
}
}
//Producer Class in java
class Producer implements Runnable {
private final BlockingQueue sharedQueue;
public Producer(BlockingQueue sharedQueue) {
this.sharedQueue = sharedQueue;
}
@Override
public void run() {
for(int i=0; i<10; i++){
try {
System.out.println("Produced: " + i);
林黛玉怎么死的
sharedQueue.put(i);
} catch (InterruptedException ex) {
}
}
}
//Consumer Class in Java
class Consumer implements Runnable{
private final BlockingQueue sharedQueue;
public Consumer (BlockingQueue sharedQueue) {
this.sharedQueue = sharedQueue;
}
@Override
public void run() {
while(true){
try {
System.out.println("Consumed: "+ sharedQueue.take());
} catch (InterruptedException ex) {
}
}
}
Output:
Produced: 0
Produced: 1
Consumed: 0
Produced: 2
Consumed: 1
Produced: 3
Consumed: 2
Produced: 4
Consumed: 3
Produced: 5
Consumed: 4
普通话儿化音Produced: 6
Consumed: 5
血藤的功效与作用
Produced: 7
Consumed: 6
Produced: 8
Consumed: 7
Produced: 9
Consumed: 8
Consumed: 9

本文发布于:2023-07-16 22:40:51,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1100370.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:产者   消费者   模式
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图