您当前的位置:首页 > IT编程 > Java
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch |

自学教程:Java 实例 - 生产者/消费者问题

51自学网 2023-01-08 20:13:31
  Java
这篇教程Java 实例 - 生产者/消费者问题写得很实用,希望能帮到您。

生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况:

存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。

Java 实例 - 生产者/消费者问题

以下实例演示了如何通过线程解决生产者/消费者问题:

/* author by codercto.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 实例 - 获取线程状态
51自学网,即我要自学网,自学EXCEL、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。
京ICP备13026421号-1