方式一:同步关键字实现

//用同步实现wait/notifyAll
public class Stroge {private LinkedList<String> list;private int maxSize;public Stroge(LinkedList<String> list, int maxSize) {this.list = list;this.maxSize = maxSize;}public void produce() {try {synchronized (list) {while (list.size() == maxSize) {list.wait();}list.add("生产一个任务");System.out.println(Thread.currentThread().getName() + "生产一个");list.notifyAll();}} catch (InterruptedException e) {}}public String consume() {try {synchronized (list) {while (list.size() == 0) {list.wait();}String consume = list.remove();System.out.println(Thread.currentThread().getName() + "消费一个");list.notifyAll();return consume;}} catch (InterruptedException e) {return null;}}public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();Stroge stroge = new Stroge(linkedList, 10);Consumer consumer1 = new Consumer(stroge);Consumer consumer2 = new Consumer(stroge);Producer producer1 = new Producer(stroge);Producer producer2 = new Producer(stroge);Thread consumerThread1 = new Thread(consumer1);Thread consumerThread2 = new Thread(consumer2);Thread produceThread1 = new Thread(producer1);Thread produceThread2 = new Thread(producer2);consumerThread1.start();consumerThread2.start();produceThread1.start();produceThread2.start();}
}class Producer implements Runnable {private Stroge stroge;public Producer(Stroge stroge) {this.stroge = stroge;}public void run() {while (true) {stroge.produce();}}}class Consumer implements Runnable {private Stroge stroge;public Consumer(Stroge stroge) {this.stroge = stroge;}public void run() {while (true) {stroge.consume();}}}

方式二:锁实现

//锁实现
public class Stroge {private ReentrantLock lock = new ReentrantLock();private Condition full = lock.newCondition();private Condition empty = lock.newCondition();private LinkedList<String> list;private int maxSize;public Stroge(LinkedList<String> list, int maxSize) {this.list = list;this.maxSize = maxSize;}public void produce() {try {lock.lock();//满了则则阻塞while (list.size() == maxSize) {full.await();}list.add("生产一个任务");System.out.println(Thread.currentThread().getName() + "生产一个");empty.signal();} catch (InterruptedException r) {} finally {lock.unlock();}}public String consume() {try {lock.lock();//为空则阻塞while (list.size() == 0) {empty.await();}String consume = list.remove();System.out.println(Thread.currentThread().getName() + "消费一个");full.signal();return consume;} catch (InterruptedException e) {return null;} finally {lock.unlock();}}public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();Stroge stroge = new Stroge(linkedList, 10);Consumer consumer1 = new Consumer(stroge);Consumer consumer2 = new Consumer(stroge);Producer producer1 = new Producer(stroge);Producer producer2 = new Producer(stroge);Thread consumerThread1 = new Thread(consumer1);Thread consumerThread2 = new Thread(consumer2);Thread produceThread1 = new Thread(producer1);Thread produceThread2 = new Thread(producer2);consumerThread1.start();consumerThread2.start();produceThread1.start();produceThread2.start();}
}class Producer implements Runnable {private Stroge stroge;public Producer(Stroge stroge) {this.stroge = stroge;}public void run() {while (true) {stroge.produce();}}}class Consumer implements Runnable {private Stroge stroge;public Consumer(Stroge stroge) {this.stroge = stroge;}public void run() {while (true) {stroge.consume();}}}

方式三:阻塞队列实现

public class Stroge {private LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>(10);public void produce() {try {//满了则会阻塞queue.put("生产了一个任务");System.out.println(Thread.currentThread().getName() + "生产一个");} catch (InterruptedException e) {e.printStackTrace();}}public String consume() {try {//空了则会阻塞String consume = queue.take();System.out.println(Thread.currentThread().getName() + "消费一个");return consume;} catch (InterruptedException e) {e.printStackTrace();return null;}}public static void main(String[] args) {Stroge stroge = new Stroge();Producer producer = new Producer(stroge);Consumer consumer = new Consumer(stroge);Thread consumer1 = new Thread(consumer);Thread producer1 = new Thread(producer);Producer producer2 = new Producer(stroge);Consumer consumer2 = new Consumer(stroge);Thread consumer22 = new Thread(consumer2);Thread producer22 = new Thread(producer2);consumer1.start();producer1.start();consumer22.start();producer22.start();}
}class Producer implements Runnable {private Stroge stroge;public Producer(Stroge stroge) {this.stroge = stroge;}public void run() {while (true) {stroge.produce();}}}class Consumer implements Runnable {private Stroge stroge;public Consumer(Stroge stroge) {this.stroge = stroge;}public void run() {while (true) {stroge.consume();}}
}

三种方式实现生产者和消费者模式相关推荐

  1. 三种方式实现生产者-消费者模型

    前言 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题描述了 ...

  2. 三种方式实现生产者消费者模式

    生产者消费者模式 此博文部分借鉴于: https://blog.csdn.net/u011109589/article/details/80519863 https://blog.csdn.net/w ...

  3. 课程介绍 复习 创建对象的三种方式 自定义构造函数创建对象 工厂模式创建对象

    课程介绍 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8 ...

  4. JAVA解决生产消费者_Java常用三种方式解决生产者消费者问题(详细)

    package test; /** * Synchronized 版本解决生产者消费者 * wait() / notify()方法 */ import java.util.LinkedList; im ...

  5. 生产者与消费者模式的概念、运用、3种实现

    生产者与消费者模式的概念.运用.3种实现 本文为笔者的学习整理总结,因此,若有任何不严谨或错误之处,还望不吝指教! 内容: 一. 概念 二. 运用 三. 实现1. Sychronized.wait.n ...

  6. discard connection丢失数据_python kafka 生产者发送数据的三种方式

    python kafka 生产者发送数据的三种方式 发送方式 同步发送 发送数据耗时最长 有发送数据的状态,不会丢失数据,数据可靠性高 以同步的方式发送消息时,一条一条的发送,对每条消息返回的结果判断 ...

  7. java bean 工厂模式_Spring框架通过工厂创建Bean的三种方式实现

    工厂模式 Spring中bean的创建,默认是框架利用反射new出来的bean实例.有时候也会有一些复杂的情况. 假设有一个飞机,属性如下,现在需要造很多同型号的飞机,那么唯一需要改变的属性只有Dri ...

  8. Kafka生产者发送消息的三种方式

    Kafka是一种分布式的基于发布/订阅的消息系统,它的高吞吐量.灵活的offset是其它消息系统所没有的. Kafka发送消息主要有三种方式: 1.发送并忘记 2.同步发送 3.异步发送+回调函数 下 ...

  9. 进入网页页面的开发者模式——三种方式

    1.什么是开发者模式:用来调试HTML,js等web内容的工具,就是开发者工具,我们可以通过开发者工具看到web页面的HTML,JS,以及浏览器的网络请求,CSS样式,内存使用等. 2.进入开发者模式 ...

最新文章

  1. 软件测试-PR录制脚本程序ie的时候闪退
  2. 设计模式学习笔记之-代理模式
  3. [云炬创业基础笔记]第五章创业计划评估16
  4. div置于页面底部_浏览器渲染页面的原理及流程
  5. ITK:更改图像原点间距或方向
  6. 文献学习(part33)--Clustering by fast search and find of density peaks
  7. SAPGUI里实现自定义的语法检查
  8. 【Windows7系统新特性】
  9. 为了摸清敌人对自己了解多少,高阶国家黑客组织Turla 决定偷走反病毒日志
  10. 牛客 2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛 签到题13题
  11. 基于FBX SDK的FBX模型解析与加载 -(二)
  12. windows+7+32位java_深度技术windows7 32位专业版下载
  13. 时间日期插件引用使用方法
  14. LeetCode07整数反转(JAVA)
  15. 四川一度智信:电商平台商品关键词优化技巧
  16. 实现ensp的单臂路由
  17. html5 audio左侧,HTML5之Audio(四)—— 左右声道
  18. 软件测试个人求职简历该怎么写?一个优质软件测试工程师简历
  19. 论文中写伪代码的工具
  20. PyQt5 界面显示无响应

热门文章

  1. kali使用aircrack-ng暴力破解密码时,提示bash: aircrack:未找到命令,等解决方案
  2. 解决vue渲染时闪烁{{}}的问题
  3. 基于ITD实现的轴承故障信号分解并附Matlab源码
  4. 3D游戏开发所需的数学基础——笛卡尔坐标系
  5. 万年历显示c语言设计,万年历C语言设计
  6. 从零单排力扣周赛_周赛275
  7. 10种黑客类型,你知道几种?
  8. 路由器漏洞挖掘(栈,危险函数,方法)
  9. 实现对Activity的定时关闭功能
  10. PBFT(Practical Byzantine Fault Tolerance)实用拜占庭容错算法