Java 生产者/消费者问题实例详解
程序员文章站
2024-02-28 20:44:04
生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下...
生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况:
存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。
以下实例演示了如何通过线程解决生产者/消费者问题:
/* author by w3cschool.cc 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反射机制深入理解
下一篇: Python 爬虫图片简单实现