广州北大青鸟计算机职业培训学校
互联网技术培训、软件技术培训、大数据培训、云计算培训、数据分析培训信息网
当前位置:网站首页 > 软件教程 > Java技术 > 正文

惠州Java如何解决生产者和消费者的问题?_北大青鸟IT计算机学校

作者:邓华发布时间:2021-03-24分类:Java技术浏览:897


导读:相信每个学习Java的同学都会遇到这样的问题,Java如何解决生产者和消费者的问题?下面我们一起来看看惠州北大青鸟老师是怎么回答的。

相信每个学习Java的同学都会遇到这样的问题,Java如何解决生产者和消费者的问题?下面我们一起来看看惠州北大青鸟老师是怎么回答的。

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

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

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

/*
author by w3cschool.cn
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的资讯,可以来惠州北大青鸟新方舟校区了解一下。

java8.png

Java

标签:惠州计算机JAVA软件开发惠州计算机Java软件开发惠州计算机JAVA培训惠州计算机JAVA软件开发学校惠州计算机Java软件开发培训JAVAJava软件开发北大青鸟IT计算机学校北大青鸟IT软件学校北大青鸟IT学校


Java技术排行
标签列表
网站分类
文章归档
最近发表