>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 28015 个阅读者 刷新本主题
 * 贴子主题:  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开发-->内部类
  JSP与Hibernate开发-->JSP中使用JavaBean(Ⅰ)
  Java网络编程-->Servlet技术详解(Ⅰ)
  精通Spring-->
  Vue3开发-->Spring、JPA与Hibernate的整合
  [求助] 如何观看孙老师的课程视频
  Java虚拟机进行类连接的原理
  Java虚拟机安全性-class文件检验器
  java实现动态编译并动态加载
  序列化与反序列化知识点汇总
  java.util.logging.Logger使用详解
  面试官问:如何排除Java虚拟机的GC引起的CPU飙高?
  Java并发编程之验证volatile不能保证原子性
  Java 冒泡排序算法
  java常见的几种调用机制:同步调用,异步调用,回调
  Java设计模式:装饰器模式
  Java入门实用代码:打印矩形
  Java 入门实用代码:汉诺塔算法
  Java入门实用代码:字符串优化测试
  通过Java读取Excel数据
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


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