阻塞队列实现生产者消费者模式

生产者消费者模式是高并发、多线程编程中精选的设计方案模式,生产者和消费者根据分离出来的进行工作解耦,简单化了开发设计模式,生产者和消费者可以以不一样的速率生产制造和交易数据信息。这篇文章大家一起来看看什么叫生产者消费者模式,这个问题也是线程同步面试问题中常常被提到的。怎么使用阻塞队列(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

扫码免费用

源码支持二开

申请免费使用

在线咨询