一、概述
一共两个线程,一个线程生产产品,一个线程消费产品,使用同步代码块方法,同步两个线程。当产品没有时,通知生产者生产,生产者生产后,通知消费者消费,并等待消费者消费完。
需要注意的是,有可能出现,停止生产产品后,消费者还没未来得及消费生产者生产的最后一个产品,就结束消费,导致最后一个产品没有被消费。
本例使用synchronize以及wait()、notify()实现简易版的线程者消费者模型。
二、测试用例
这里的产品用笔来演示,每只笔都有其编号code
一共有四个类:分别是生产者类,产品类,消费者类,测试类
产品
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多线程生产者消费者模式实现过程解析,包括了Java多线程生产者消费者模式实现过程解析的使用技巧和注意事项,需要的朋友参考一下 单生产者与单消费者 示例: 执行结果如下: 多生产者与多消费者 这种模式下,容易出现“假死”,也就是全部线程都进入了 WAITNG 状态,程序不在执行任何业务功能了,整个项目呈停止状态。 示例: 运行结果如图: 分析: 虽然代码中通过 wait/not
生产者线程与消费者线程使用信号量同步 生产者线程与消费者线程使用信号量同步 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-08-24 yangjie the f
我正在处理一个kafka用例,在这个用例中,我需要在生产者和消费者端具有事务性语义...我可以使用kafka transaction API 0.11将事务性消息发布到kafka集群,但在消费者端,我面临着一个问题...我在属性文件中设置了但我不能使用它...我可以看到消息被使用但这不是希望的... 生产者代码 ProducerTX.Properties 消费者 感谢你的帮助..谢谢
本文向大家介绍详解Python 模拟实现生产者消费者模式的实例,包括了详解Python 模拟实现生产者消费者模式的实例的使用技巧和注意事项,需要的朋友参考一下 详解Python 模拟实现生产者消费者模式的实例 散仙使用python3.4模拟实现的一个生产者与消费者的例子,用到的知识有线程,队列,循环等,源码如下: Python代码 在本例里面散仙启动了1个生产者线程,2个消费者线程,打印效果如下:
本文向大家介绍Python semaphore evevt生产者消费者模型原理解析,包括了Python semaphore evevt生产者消费者模型原理解析的使用技巧和注意事项,需要的朋友参考一下 线程锁相当于同时只能有一个线程申请锁,有的场景无数据修改互斥要求可以同时让多个线程同时运行,且需要限制并发线程数量时可以使用信号量 两个或者多个线程需要交互时,且一个进程需要根据另一线程状态执行对应操
一、线程间通信的两种方式 1.wait()/notify() Object类中相关的方法有notify方法和wait方法。因为wait和notify方法定义在Object类中,因此会被所有的类所继承。这些方法都是final的,即它们都是不能被重写的,不能通过子类覆写去改变它们的行为。 ①wait()方法: 让当前线程进入等待,并释放锁。 ②wait(long)方法: 让当前线程进入等待,并释放锁,