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

 更新时间:2017年04月18日 11:20:24   投稿:wbb  
这篇文章主要实例分析了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

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

相关文章

  • 超简洁java实现双色球若干注随机号码生成(实例代码)

    超简洁java实现双色球若干注随机号码生成(实例代码)

    这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • SpringBoot 指标监控actuator的专题

    SpringBoot 指标监控actuator的专题

    未来每一个微服务在云上部署以后,我们都需要对其进行监控、追踪、审计、控制等。SpringBoot就抽取了Actuator场景,使得我们每个微服务快速引用即可获得生产级别的应用监控、审计等功能,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下
    2021-11-11
  • @CacheEvict注解,清除缓存方式

    @CacheEvict注解,清除缓存方式

    这篇文章主要介绍了@CacheEvict注解,清除缓存方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 在启动后台 jar包时,使用指定的 application.yml操作

    在启动后台 jar包时,使用指定的 application.yml操作

    这篇文章主要介绍了在启动后台 jar包时,使用指定的 application.yml操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Spring初始化和销毁的实现方法

    Spring初始化和销毁的实现方法

    这篇文章主要介绍了Spring初始化和销毁的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • RabbitMQ消息队列的目录结构

    RabbitMQ消息队列的目录结构

    这篇文章主要介绍了RabbitMQ消息队列的目录结构,RabbitMQ 属于消息中间件,主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然,那么用了那么久RabbitMQ,其目录结构是怎样的呢,让我们一起来看一下吧
    2023-08-08
  • 浅谈一下Java中的访问修饰符以及作用

    浅谈一下Java中的访问修饰符以及作用

    这篇文章主要介绍了浅谈一下Java中的访问修饰符以及作用,修饰符修饰的是“被访问”的权限,所有修饰符都可以修饰成员变量,方法,构造方法,需要的朋友可以参考下
    2023-05-05
  • Java判断101-200之间有多少个素数并输出

    Java判断101-200之间有多少个素数并输出

    这篇文章主要介绍了Java判断101-200之间有多少个素数并输出,需要的朋友可以参考下
    2017-02-02
  • 精通Java泛型的使用与原理

    精通Java泛型的使用与原理

    针对利用继承来实现通用程序设计所产生的问题,泛型提供了更好的解决方案,本文详细的介绍了Java泛型的使用与原理,感兴趣的可以了解一下
    2022-03-03
  • WIN7系统JavaEE(tomcat7 Eclipse)环境配置教程(二)

    WIN7系统JavaEE(tomcat7 Eclipse)环境配置教程(二)

    这篇文章主要介绍了WIN7系统JavaEE(java+tomcat7+Eclipse)环境配置教程,本文重点在于tomcat配置、Eclipse配置,感兴趣的小伙伴们可以参考一下
    2016-06-06

最新评论