Java 生产者/消费者问题实例详解

作者:wbb 时间:2023-02-26 01:23:36 

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

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

Java 生产者/消费者问题实例详解

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


/*
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

希望本篇文章对您有所帮助

来源:http://www.2cto.com/kf/201601/486921.html

标签:Java,生产者消费者
0
投稿

猜你喜欢

  • WPF仿LiveCharts实现饼图的绘制

    2022-02-08 02:17:05
  • 深入理解Android中的建造者模式

    2023-06-27 05:55:17
  • java中归并排序和Master公式详解

    2022-03-30 08:53:19
  • 简单介绍Android开发中的Activity控件的基本概念

    2022-02-23 23:46:21
  • 一文教你如何使用Databinding写一个关注功能

    2023-09-17 12:26:47
  • 浅谈Java堆外内存之突破JVM枷锁

    2022-10-19 19:46:50
  • C#资源释放方法实例分析

    2022-03-22 04:46:20
  • java后台接受到图片后保存方法

    2023-06-03 09:23:04
  • c#典型工厂化实现实例

    2022-01-04 19:41:08
  • Java8 HashMap键与Comparable接口小结

    2023-11-29 10:10:31
  • 详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别

    2022-08-18 19:21:44
  • C#学习基础概念二十五问 11-15

    2022-04-18 04:19:00
  • 基于Java实现双向链表

    2022-11-17 11:39:16
  • Android开发之使用150行代码实现滑动返回效果

    2023-03-20 11:08:50
  • C语言实现矩阵翻转(上下翻转、左右翻转)

    2023-10-24 22:42:36
  • MyBatis-Plus 集成动态多数据源的实现示例

    2023-06-26 17:56:35
  • Spring计时器StopWatch使用示例

    2023-05-16 21:23:02
  • C#设计模式之职责链模式示例详解

    2023-11-08 05:26:38
  • idea构建web项目的超级详细教程

    2023-09-07 13:21:39
  • C#获取网页源代码的方法

    2023-06-19 05:43:44
  • asp之家 软件编程 m.aspxhome.com