>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 22039 个阅读者 刷新本主题
 * 贴子主题:  Java入门实用代码:生产者/消费者问题 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-01-21 15:09:31     消息  查看  搜索  好友  邮件  复制  引用

  

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

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

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


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

/*

author by javathinker.net

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


程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-01-27 16:13:55 重新编辑]
  Java面向对象编程-->数据类型
  JavaWeb开发-->Web运作原理(Ⅳ)
  JSP与Hibernate开发-->持久化层的映射类型
  Java网络编程-->Socket用法详解
  精通Spring-->计算属性和数据监听
  Vue3开发-->Vue指令
  被迫重构代码,这次我干掉了 if-else
  使用 RocketMQ 事务消息,实现分布事务
  Synchronized与ReentrantLock区别总结
  Java读取大文件的高效率实现_java大文件
  Eclipse使用指南:工作空间(Workspace)
  正则表达式基础入门
  Java设计模式:观察者模式
  Java设计模式:享元模式
  用BigDecimal进行精确运算的范例
  java比c++强大之处JVM垃圾收集算法
  5个非常有挑战性的Java面试题
  Java入门实用代码:死锁及解决方法
  Java入门实用代码:文件重命名
  java使用gzip实现文件解压缩示例
  native2ascii.exe 的Java实现类
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。