程式代碼如下:
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<E> {</code>
<code> </code><code>//1. 提供集合容器</code>
<code> </code><code>private</code> <code>List<E> list = </code><code>new</code> <code>ArrayList<E>();</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<String> queue = </code><code>new</code> <code>MyQueue<String>(</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>