天天看点

wait/notify模拟阻塞队列

程序代码如下:

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

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

<code>public</code> <code>class</code> <code>MyQueue&lt;E&gt; {</code>

<code>    </code><code>//1. 提供集合容器</code>

<code>    </code><code>private</code> <code>List&lt;E&gt; list = </code><code>new</code> <code>ArrayList&lt;E&gt;();</code>

<code>    </code><code>//2. 提供计数器</code>

<code>    </code><code>private</code> <code>AtomicInteger counter = </code><code>new</code> <code>AtomicInteger();</code>

<code>    </code><code>//3. 提供 上限 下限</code>

<code>    </code><code>private</code> <code>int</code> <code>MAX;</code>

<code>    </code><code>private</code> <code>int</code> <code>MIN = </code><code>0</code><code>;</code>

<code>    </code><code>//4. 提供锁对象</code>

<code>    </code><code>private</code> <code>Object lock = </code><code>new</code> <code>Object();</code>

<code>    </code><code>public</code> <code>MyQueue(</code><code>int</code> <code>max){</code>

<code>        </code><code>this</code><code>.MAX = max;</code>

<code>    </code><code>}</code>

<code>    </code><code>//5. put</code>

<code>    </code><code>public</code> <code>void</code> <code>put(E e){</code>

<code>        </code><code>synchronized</code> <code>(lock){</code>

<code>            </code><code>while</code> <code>(counter.get() == MAX){</code>

<code>                </code><code>try</code> <code>{</code>

<code>                    </code><code>lock.wait();</code>

<code>                </code><code>} </code><code>catch</code> <code>(InterruptedException e1) {</code>

<code>                    </code><code>e1.printStackTrace();</code>

<code>                </code><code>}</code>

<code>            </code><code>}</code>

<code>            </code><code>list.add(e);</code>

<code>            </code><code>System.out.println(</code><code>"put "</code> <code>+ e);</code>

<code>            </code><code>counter.incrementAndGet();</code>

<code>            </code><code>lock.notify();</code>

<code>        </code><code>}</code>

<code>    </code><code>//6. take</code>

<code>    </code><code>public</code> <code>E take(){</code>

<code>        </code><code>E e = </code><code>null</code><code>;</code>

<code>            </code><code>while</code> <code>(counter.get() == MIN){</code>

<code>            </code><code>e = list.remove(</code><code>0</code><code>);</code>

<code>            </code><code>System.out.println(</code><code>"take "</code> <code>+ e);</code>

<code>            </code><code>counter.decrementAndGet();</code>

<code>        </code><code>return</code> <code>e;</code>

<code>    </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args) {</code>

<code>        </code><code>final</code> <code>MyQueue&lt;String&gt; queue = </code><code>new</code> <code>MyQueue&lt;String&gt;(</code><code>5</code><code>);</code>

<code>        </code><code>Thread t1 = </code><code>new</code> <code>Thread(</code><code>new</code> <code>Runnable() {</code>

<code>            </code><code>@Override</code>

<code>            </code><code>public</code> <code>void</code> <code>run() {</code>

<code>                </code><code>queue.put(</code><code>"a"</code><code>);</code>

<code>                </code><code>queue.put(</code><code>"b"</code><code>);</code>

<code>                </code><code>queue.put(</code><code>"c"</code><code>);</code>

<code>                </code><code>queue.put(</code><code>"d"</code><code>);</code>

<code>                </code><code>queue.put(</code><code>"e"</code><code>);</code>

<code>                </code><code>queue.put(</code><code>"f"</code><code>);</code>

<code>                </code><code>queue.put(</code><code>"g"</code><code>);</code>

<code>        </code><code>});</code>

<code>        </code><code>Thread t2 = </code><code>new</code> <code>Thread(</code><code>new</code> <code>Runnable() {</code>

<code>                </code><code>queue.take();</code>

<code>        </code><code>t1.start();</code>

<code>        </code><code>try</code> <code>{</code>

<code>            </code><code>Thread.sleep(</code><code>1000</code><code>);</code>

<code>        </code><code>} </code><code>catch</code> <code>(InterruptedException e) {</code>

<code>            </code><code>e.printStackTrace();</code>

<code>        </code><code>t2.start();</code>

<code>}</code>

思路分析:

队列中的元素需要储存,可以简单考虑为List集合储存

既然是模拟实现阻塞队列,那么队列应该有容量限制,上限和下限

应该提供一个计数器的功能,告知什么时候队列可以写入,什么时候必须等待,最好的选择当然是Atomic类

wait/notify依赖于锁,所以提供锁对象

<b></b>

<b>本文转自zfz_linux_boy 51CTO博客,原文链接:http://blog.51cto.com/zhangfengzhe/1875991,如需转载请自行联系原作者</b>

继续阅读