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

作者:main(0) 时间:2023-12-03 01:33:26 

一、概述

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

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

本例使用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实现简易生产者消费者模型过程解析

来源:https://www.cnblogs.com/main404/p/13022369.html

标签:Java,生产,消费,模型
0
投稿

猜你喜欢

  • 浅谈java 面对对象(抽象 继承 接口 多态)

    2022-04-01 07:23:50
  • SpringBoot JS-SDK自定义微信分享的实现

    2023-11-10 05:08:28
  • C#基于Mongo的官方驱动手撸一个Super简易版MongoDB-ORM框架

    2021-06-05 17:27:50
  • C# NAudio 库的各种常见使用方式之播放 录制 转码 音频可视化

    2023-06-20 04:14:16
  • SpringBoot接口如何统一异常处理

    2023-08-10 15:06:20
  • c++代码调试方式的几点建议

    2023-07-05 05:31:35
  • 全面解析Java支持的数据类型及Java的常量和变量类型

    2022-03-25 16:54:10
  • Java创建线程的五种写法总结

    2023-01-10 04:39:34
  • Java String 字符串常量池解析

    2023-01-08 19:44:05
  • Spring中的注解@Autowired实现过程全解(@Autowired 背后的故事)

    2023-01-01 06:02:53
  • Android自定义wheelview实现滚动日期选择器

    2021-11-22 16:04:19
  • HttpServletRequest对象常用功能_动力节点Java学院整理

    2022-01-05 10:37:08
  • IDEA的Mybatis Generator驼峰配置问题

    2023-03-24 02:21:32
  • 深入c# GDI+简单绘图的具体操作步骤(二)

    2022-01-31 12:43:49
  • C++实现希尔排序(ShellSort)

    2022-03-03 22:29:13
  • java多线程之CyclicBarrier的使用方法

    2023-11-04 21:52:54
  • Android开发中通过手机号+短信验证码登录的实例代码

    2023-03-10 10:57:13
  • Android中RecyclerView实现分页滚动的方法详解

    2023-11-13 13:59:53
  • Java数据结构之链表(动力节点之Java学院整理)

    2022-08-29 16:40:18
  • 基于JDK8总结java中的interrupt

    2021-12-27 07:43:54
  • asp之家 软件编程 m.aspxhome.com