欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java实现简易生产者消费者模型过程解析

程序员文章站 2022-11-01 14:31:39
一、概述一共两个线程,一个线程生产产品,一个线程消费产品,使用同步代码块方法,同步两个线程。当产品没有时,通知生产者生产,生产者生产后,通知消费者消费,并等待消费者消费完。需要注意的是,有可能出现,停...

一、概述

一共两个线程,一个线程生产产品,一个线程消费产品,使用同步代码块方法,同步两个线程。当产品没有时,通知生产者生产,生产者生产后,通知消费者消费,并等待消费者消费完。

需要注意的是,有可能出现,停止生产产品后,消费者还没未来得及消费生产者生产的最后一个产品,就结束消费,导致最后一个产品没有被消费。

本例使用synchronize以及wait()、notify()实现简易版的线程者消费者模型。

二、测试用例

这里的产品用笔来演示,每只笔都有其编号code

一共有四个类:分别是生产者类,产品类,消费者类,测试类

Java实现简易生产者消费者模型过程解析

产品

package test.exception.producer_consumer_model;

/*
假设为产品为笔
 */

public class production {
  private string type = "";
  private string color = "";
  private long code = 0; // 产品编号
  private boolean isproduced = false; // 是否生产完成 初始状态为未生产状态
  private boolean iscontinueproduce = true; // 是否停产该产品

  public void setcontinueproduce(boolean continueproduce) {
    iscontinueproduce = continueproduce;
  }

  public void setcode(long code) {
    this.code = code;
  }

  public production(){
  }

  public boolean iscontinueproduce() {
    return iscontinueproduce;
  }

  public void settype(string type) {
    this.type = type;
  }

  public void setcolor(string color) {
    this.color = color;
  }

  public void setproduced(boolean produced) {
    isproduced = produced;
  }

  public boolean isproduced() {
    return isproduced;
  }

  @override
  public string tostring() {
    return color + type + "-" + code;
  }
}

生产者

package test.exception.producer_consumer_model;

public class producer implements runnable {
  private final production pen; // 产品

  public producer(production pen) {
    this.pen = pen;
  }

  // 生产
  public void produce() {
    long code = 0;
    while (this.pen.iscontinueproduce()) {
      synchronized (this.pen) {
        if (this.pen.isproduced()) {
          try {
            this.pen.wait(); // 等待消费者消费
          } catch (interruptedexception e) {
            e.printstacktrace();
          }
        }
        // 开始生产
        this.pen.settype("铅笔");
        this.pen.setcolor("蓝色");
        this.pen.setcode(code++);
        this.pen.setproduced(true);
        system.out.println(this.pen + " is produced");
        this.pen.notify();
      }
    }
    system.out.println("finish producing");
  }
  @override
  public void run() {
    produce();
  }
}

消费者

package test.exception.producer_consumer_model;

public class consumer implements runnable {
  private final production pen;

  public consumer(production pen) {
    this.pen = pen;
  }

  // 持续消费
  public void consumer() {
    while (this.pen.iscontinueproduce()) {
      synchronized (this.pen) {
        if (!this.pen.isproduced()) {
          try {
            this.pen.wait(); // 等待生产者生产
          } catch (interruptedexception e) {
            e.printstacktrace();
          }
        }

        system.out.println(this.pen + " is consumed"); // 使用
        this.pen.setproduced(false); // 使用完后更新状态
        this.pen.notify();
      }
    }
    // 确保停止生产后,能够使用最后生产的一支笔
    if (this.pen.isproduced()) {
      system.out.println(this.pen + " is consumed");
    }

    system.out.println("finish using");
  }

  @override
  public void run() {
    consumer();
  }
}

主线程测试

package test.exception.producer_consumer_model;

public class demo {
  public static void main(string[] args) throws interruptedexception {
    production pen = new production();
    consumer consumer = new consumer(pen);
    producer producer = new producer(pen);
    new thread(producer).start(); // 开启生产者线程
    new thread(consumer).start(); // 开启消费者线程

    thread.sleep(10000);
    pen.setcontinueproduce(false); // 10s后停止生产该类型的笔
  }
}

运行结果

Java实现简易生产者消费者模型过程解析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。