生产者消费者模式是高并发、多线程编程中精选的设计方案模式,生产者和消费者根据分离出来的进行工作解耦,简单化了开发设计模式,生产者和消费者可以以不一样的速率生产制造和交易数据信息。这篇文章大家一起来看看什么叫生产者消费者模式,这个问题也是线程同步面试问题中常常被提到的。怎么使用阻塞队列(Blocking Queue)处理生产者消费者模式,及其应用生产者消费者模式的益处。
真实的世界中的生产者消费者模式
生产者和消费者模式在日常生活之中经常可以看到,它叙述的是融洽与协同的关联。例如一个人已经提前准备食材(生产者),而另一个人已经吃(消费者),她们应用一个同用的餐桌用以置放菜盘和拿走菜盘,生产者提前准备食材,假如桌子上早已满了就等候,消费者(那一个吃的)等候假如餐桌空了得话。这儿餐桌便是一个分享的目标。在Java
Executor架构本身完成了生产者消费者模式他们各自承担加上和执行任务。
生产者消费者模式的益处
它确实是一种实用性强的设计方案模式,常见于撰写线程同步或高并发编码。下边是它的一些优势:
它简单化的开发设计,你能单独地或高并发的撰写消费者和生产者,它只是只需了解共享资源目标到底是谁
生产者不用了解哪位消费者或是有多少消费者,对消费者而言也是一样
生产者和消费者可以以不一样的速率实行
分离出来的消费者和生产者在作用上可以写下更简约、可读、易维系的编码
线程同步中的生产者消费者问题
生产者消费者问题是一个时髦的面试问题,招聘者会需要你完成生产者消费者设计方案模式,以致于能让生产者应等候假如队列或竹篮满了得话,消费者等候假如队列或是竹篮是空的。这个问题可以用不一样的方法来实际,經典的办法是应用wait和notify方式在生产者和消费者进程中协作,在队列满了或是队列是空的前提下堵塞,Java5的阻塞队列(BlockingQueue)算法设计更简易,因为它暗含的给予了那些操纵,如今你不用应用wait和nofity在生产者和消费者中间通讯了,阻塞队列的put()方式将堵塞假如队列满了,队列take()方式将堵塞假如队列是空的。在下一部分我们可以见到编码事例。
应用阻塞队列完成生产者消费者模式
阻塞队列实现生产者消费者模式超级简单,它给予拆箱即用适用堵塞的方式put()和take(),开发人员不用写疑惑的wait-nofity编码去完成通讯。BlockingQueue
一个插口,Java5给予了不一样的实际,如ArrayBlockingQueue和LinkedBlockingQueue,二者全是先进先出法(FIFO)次序。而ArrayLinkedQueue是当然有限的,LinkedBlockingQueue可选择的界限。下边这是一个详细的生产者消费者编码事例,比照传统的的wait、nofity编码,它更容易了解。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
**
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89importjava.util.concurrent.BlockingQueue;
importjava.util.concurrent.LinkedBlockingQueue;
importjava.util.logging.Level;
importjava.util.logging.Logger;
publicclassProducerConsumerPattern {
publicstaticvoid ** in(String args[]){
//Creating shared object
BlockingQueue sharedQueue =newLinkedBlockingQueue();
//Creating Producer and Consumer Thread
Thread prodThread =newThread(newProducer(sharedQueue));
Thread consThread =newThread(newConsumer(sharedQueue));
//Starting producer and Consumer thread
prodThread.start();
consThread.start();
}
}
//Producer Class in java
classProducerimplementsRunnable {
privatefinalBlockingQueue sharedQueue;
publicProducer(BlockingQueue sharedQueue) {
this.sharedQueue = sharedQueue;
}
@Override
publicvoidrun() {
for(inti=0; i
扫码咨询与免费使用
申请免费使用