• 技术文章 >Java >java教程

    关于java生产者与消费者的实例详解

    Y2JY2J2017-05-06 13:22:53原创762
    这篇文章主要实例分析了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

    【相关推荐】

    1. Java免费视频教程

    2. 极客学院Java视频教程

    3. FastJson开发教程

    以上就是关于java生产者与消费者的实例详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    上一篇:java通过JPA进行数据库操作的实例详解 下一篇:关于vector类的实例方法详解
    大前端线上培训班

    相关文章推荐

    • 理解java8中java.util.function.*pojo反射新方法(附代码)• 浅析安卓app和微信授权登录及分享完整对接(代码分享)• 一招教你使用java快速创建Map(代码分享)• 教你一招搞定时序数据库在Spring Boot中的使用• 一文讲解Java中初始化List集合的8种方式(附代码)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网