生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示
生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况:
存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。
以下实例演示了如何通过线程解决生产者/消费者问题:
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 | /* author by javaidea.com ProducerConsumerTest.java */ public class ProducerConsumerTest { public static void main(String[] args) { CubbyHole c = new CubbyHole(); Producer p1 = new Producer(c, 1 ); Consumer c1 = new Consumer(c, 1 ); p1.start(); c1.start(); } } class CubbyHole { private int contents; private boolean available = false ; public synchronized int get() { while (available == false ) { try { wait(); } catch (InterruptedException e) { } } available = false ; notifyAll(); return contents; } public synchronized void put( int value) { while (available == true ) { try { wait(); } catch (InterruptedException e) { } } contents = value; available = true ; notifyAll(); } } class Consumer extends Thread { private CubbyHole cubbyhole; private int number; public Consumer(CubbyHole c, int number) { cubbyhole = c; this .number = number; } public void run() { int value = 0 ; for ( int i = 0 ; i < 10 ; i++) { value = cubbyhole.get(); System.out.println( "消费者 #" + this .number+ " got: " + value); } } } class Producer extends Thread { private CubbyHole cubbyhole; private int number; public Producer(CubbyHole c, int number) { cubbyhole = c; this .number = number; } public void run() { for ( int i = 0 ; i < 10 ; i++) { cubbyhole.put(i); System.out.println( "生产者 #" + this .number + " put: " + i); try { sleep(( int )(Math.random() * 100 )); } catch (InterruptedException e) { } } } } |
以上代码运行输出结果为:
消费者 #1 got: 0
生产者 #1 put: 0
生产者 #1 put: 1
消费者 #1 got: 1
生产者 #1 put: 2
消费者 #1 got: 2
生产者 #1 put: 3
消费者 #1 got: 3
生产者 #1 put: 4
消费者 #1 got: 4
生产者 #1 put: 5
消费者 #1 got: 5
生产者 #1 put: 6
消费者 #1 got: 6
生产者 #1 put: 7
消费者 #1 got: 7
生产者 #1 put: 8
消费者 #1 got: 8
生产者 #1 put: 9
消费者 #1 got: 9
以上就是Java如何通过线程解决生产者/消费者问题的详细内容,更多关于Java 解决生产者/消费者问题的资料请关注自学编程网其它相关文章!
- 本文固定链接: https://zxbcw.cn/post/197160/
- 转载请注明:必须在正文中标注并保留原文链接
- QQ群: PHP高手阵营官方总群(344148542)
- QQ群: Yii2.0开发(304864863)