并发编程之生产者消费者模式实现方式三
最近一段时间在忙,好久没有更新博客了,前面两篇文章我们分别用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将阻塞,等待队列中有了元素之后才会继续执行。

浙公网安备 33010602011771号