并发编程之生产者消费者模式实现方式三

  最近一段时间在忙,好久没有更新博客了,前面两篇文章我们分别用wait和notify,await和signalAll实现了生产者消费者模式,这两种实现方式基本是类似的,但是await和signalAll可以精确指定,所以可读性更强,这两种方式实现起来相对比较复杂,本片文章我们将用更为简单的一种方式实现我们的生产者消费者模式,java中为我们提供了一个阻塞队列BlockingQueue,我们将基于BlockingQueue来实现生产者消费者模式,代码如下:

 1 package com.fanjf.thread;
 2 
 3 import java.util.Random;
 4 import java.util.concurrent.LinkedBlockingQueue;
 5 
 6 public class Mycontainer6 {
 7     LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>();
 8     final int MAX = 100;
 9     private void put(String s){
10         queue.add(s);    
11     }
12     private String get(){
13         String s = null;
14         try {
15             s = queue.take();
16         } catch (InterruptedException e) {
17             e.printStackTrace();
18         }
19         return s;
20     }
21     public static void main(String[] args) {
22         final Mycontainer6 queue = new Mycontainer6();
23         for(int i=0;i<10;i++){
24             new Thread(new Runnable() {
25                 public void run() {
26                     for(int j=0;j<100;j++){
27                         System.out.println("消费者"+Thread.currentThread().getName()+"取出"+queue.get());
28                     }
29                     
30                 }
31             },"c"+i).start();
32         }
33         
34         for(int i=0;i<100;i++){
35             new Thread(new Runnable() {
36                 public void run() {
37                     for(int j=0;j<10;j++){
38                         Random random = new Random();
39                         int r = random.nextInt();
40                         queue.put(Integer.toString(r));
41                         System.out.println("生产者"+Thread.currentThread().getName()+"放入"+r);
42                     }
43                     
44                 }
45             },"p"+i).start();
46         }
47         
48     }
49 }

执行结果如下:

  1 生产者p0放入-1665307540
  2 消费者c8取出1190913899
  3 消费者c7取出-211311764
  4 消费者c9取出415485909
  5 生产者p7放入-1808747030
  6 消费者c6取出558964733
  7 生产者p4放入1891545800
  8 消费者c5取出1891545800
  9 消费者c4取出-1665307540
 10 生产者p3放入-211311764
 11 生产者p3放入1644555487
 12 生产者p2放入-1272215545
 13 消费者c6取出1644555487
 14 消费者c4取出-1801818155
 15 生产者p1放入558964733
 16 消费者c0取出-1272215545
 17 生产者p6放入1190913899
 18 消费者c0取出344114504
 19 生产者p1放入344114504
 20 生产者p2放入-1801818155
 21 生产者p2放入370006887
 22 消费者c9取出1604283472
 23 消费者c9取出2065173866
 24 生产者p3放入1604283472
 25 消费者c5取出-477123547
 26 生产者p4放入-477123547
 27 消费者c7取出763909086
 28 生产者p7放入763909086
 29 消费者c8取出-1185821113
 30 生产者p9放入-1185821113
 31 生产者p9放入919840482
 32 生产者p8放入415485909
 33 消费者c3取出-25731964
 34 消费者c3取出1354928678
 35 消费者c3取出302587754
 36 生产者p5放入792805818
 37 生产者p0放入-25731964
 38 消费者c3取出1208092736
 39 消费者c1取出792805818
 40 消费者c2取出-1808747030
 41 消费者c3取出-1258445416
 42 生产者p0放入-1258445416
 43 生产者p5放入1208092736
 44 生产者p5放入128088653
 45 生产者p8放入302587754
 46 生产者p9放入1354928678
 47 生产者p9放入-104348384
 48 消费者c8取出919840482
 49 消费者c7取出-1667428405
 50 生产者p7放入-1667428405
 51 生产者p4放入-1575699447
 52 消费者c5取出-1575699447
 53 生产者p3放入-684577307
 54 消费者c9取出-684577307
 55 生产者p2放入2065173866
 56 消费者c4取出370006887
 57 消费者c6取出636989942
 58 生产者p1放入636989942
 59 消费者c0取出-915037530
 60 生产者p6放入-915037530
 61 消费者c0取出-325600107
 62 生产者p1放入-645575705
 63 消费者c6取出-1831924997
 64 消费者c4取出-512411246
 65 生产者p2放入-325600107
 66 消费者c9取出482054834
 67 生产者p3放入-1831924997
 68 消费者c5取出84339138
 69 生产者p4放入-512411246
 70 生产者p7放入482054834
 71 生产者p7放入-1083165047
 72 消费者c7取出-104348384
 73 消费者c8取出113180415
 74 消费者c8取出-1083165047
 75 消费者c8取出834550949
 76 生产者p9放入84339138
 77 生产者p8放入113180415
 78 消费者c8取出1156679703
 79 消费者c3取出-1828506769
 80 生产者p5放入-1828506769
 81 生产者p5放入1396153638
 82 消费者c2取出128088653
 83 生产者p0放入-730892229
 84 生产者p0放入-71829171
 85 消费者c1取出-730892229
 86 生产者p0放入-235262731
 87 消费者c2取出881087375
 88 生产者p5放入881087375
 89 消费者c3取出1396153638
 90 消费者c3取出-1175004663
 91 消费者c3取出-1345702078
 92 消费者c8取出-473090494
 93 生产者p8放入-473090494
 94 生产者p9放入1156679703
 95 消费者c7取出-36050977
 96 生产者p7放入834550949
 97 生产者p4放入-36050977
 98 消费者c5取出176100102
 99 生产者p3放入176100102
100 生产者p3放入226928182
101 消费者c9取出-2004516279
102 生产者p2放入-2004516279
103 消费者c4取出-931981516
104 消费者c6取出-1608220432
105 消费者c6取出1142357145
106 生产者p1放入-931981516
107 生产者p1放入1672304898
108 消费者c0取出-645575705
109 消费者c0取出-908824789
110 生产者p6放入-1608220432
111 生产者p6放入-1018502892
112 生产者p6放入97215380
113 生产者p1放入-908824789
114 生产者p1放入1946457773
115 消费者c6取出1672304898
116 消费者c6取出97215380
117 消费者c4取出881786330
118 消费者c4取出1946457773
119 消费者c4取出-1273110717
120 生产者p2放入1142357145
121 生产者p2放入80792527
122 消费者c9取出226928182
123 生产者p3放入881786330
124 消费者c5取出-708659366
125 生产者p4放入-708659366
126 生产者p4放入-1225502259
127 消费者c7取出1329362327
128 生产者p7放入1329362327
129 生产者p7放入1495882617
130 生产者p7放入-1049762516
131 生产者p7放入1066918928
132 消费者c8取出-389465242
133 生产者p9放入-389465242
134 生产者p9放入-456584684
135 消费者c3取出932178243
136 生产者p8放入932178243
137 生产者p5放入-1345702078
138 消费者c2取出-235262731
139 生产者p0放入-1175004663
140 消费者c1取出-71829171
141 生产者p0放入-720576587
142 消费者c2取出1495882617
143 生产者p5放入2126161813
144 生产者p8放入697905882
145 生产者p9放入-1271487311
146 生产者p9放入-1804930092
147 消费者c8取出1182992487
148 消费者c7取出-1225502259
149 生产者p4放入1182992487
150 生产者p4放入-85883082
151 消费者c5取出1897264920
152 生产者p3放入1897264920
153 生产者p3放入-1045855273
154 消费者c9取出-1327692277
155 生产者p2放入-1327692277
156 生产者p2放入-707758752
157 消费者c4取出80792527
158 消费者c6取出-15311437
159 生产者p1放入-1273110717
160 生产者p1放入160673154
161 生产者p6放入-15311437
162 消费者c0取出-1018502892
163 消费者c0取出353326884
164 生产者p6放入-2119294521
165 消费者c6取出-720576587
166 消费者c4取出2126161813
167 消费者c9取出697905882
168 消费者c5取出-1271487311
169 生产者p4放入574868133
170 消费者c7取出-456584684
171 生产者p8放入-602269781
172 生产者p5放入-1704678575
173 消费者c2取出1066918928
174 生产者p0放入353326884
175 消费者c1取出-1049762516
176 生产者p0放入-865283655
177 消费者c2取出574868133
178 生产者p5放入-1259093619
179 生产者p8放入-659576543
180 消费者c7取出-85883082
181 消费者c5取出-1804930092
182 消费者c9取出-602269781
183 生产者p6放入-2052172986
184 消费者c0取出-1704678575
185 生产者p6放入-1537500712
186 消费者c5取出-2119294521
187 消费者c7取出160673154
188 生产者p8放入-1052600586
189 消费者c2取出-707758752
190 消费者c1取出-1045855273
191 消费者c2取出-659576543
192 生产者p8放入1460807848
193 生产者p6放入1600983003
194 消费者c0取出-2052172986
195 消费者c2取出-865283655
196 消费者c1取出-1259093619
197 消费者c1取出-1052600586
198 消费者c1取出-1537500712
199 消费者c1取出1600983003
200 消费者c1取出1460807848

  从上面的程序中我们可以看到,我们的代码块或者方法并没有加锁,这里我们用到LinkedBlockingQueue的add和take方法,这里的take是阻塞方法,当队列中没有元素时,take将阻塞,等待队列中有了元素之后才会继续执行。

posted @ 2019-05-20 15:44  飞非的博客  阅读(398)  评论(0)    收藏  举报