>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 22040 个阅读者 刷新本主题
 * 贴子主题:  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 重新编辑]
网站系统异常


系统异常信息
Request URL: http://www.javathinker.net/WEB-INF/lybbs/jsp/topic.jsp?postID=1587

java.lang.NullPointerException

如果你不知道错误发生的原因,请把上面完整的信息提交给本站管理人员