多线程终极模式:生产者-消费者模式
多线程de小事情
导航不迷路:
- 程序、进程以及线程的爱恨情仇
- 最简单实现多线程的方法(Thread)
- 简单易懂的多线程(通过实现Runnable接口实现多线程)
- 常用获取线程基本信息的方法(新手专属)
- 多线程,你觉得你安全了?(线程安全问题)
- 多线程别怕,有锁就安全;(解决线程安全问题)
- 锁用不好,可能把自己锁住哦!(解决多线程的死锁问题)
文章目录
- 多线程de小事情
- 前言
- 生产者-消费者模式小科普
- 一、何为生产者
- 二、何为消费者
- 三、缓冲区
- 设置缓冲区的三大优点:
- 代码
- 总结
- 随便说说:
前言
在多线程中,我们经常需要多个线程并发与协作,简称线程并发协作;
那么我们就要了解一个非常经典的一个线程并发模式:生产者-消费者模式;
生产者-消费者模式小科普
一、何为生产者
生产者就是负责生产数据的模块(该模块可以是对象、方法、进程或是线程)
二、何为消费者
消费者就是负责处理数据的模块(该模块可以是对象、方法、进程或是线程)
三、缓冲区
缓冲区是生产者-消费者模式的重要组成部分(核心);相当一个“容器”,生产者生产数据后会放入缓冲区,消费者会从缓冲区内取需要处理的数据;
看到这里可能就有同学会问了,生产者直接将生产的数据交给消费者不就好了吗?
为什么还弄的缓冲区,怪麻烦的!
那我们就要看看,缓冲区的优点了:
设置缓冲区的三大优点:
1.通过缓存可以实现并发协作
生产者只需要将生产的数据放入缓冲区内,不需要考虑消费者的消费状况;同理消费者只需要从缓冲区内拿需要处理的数据,不需要考虑生产者的生产情况;这样就实现了生产者与消费者的分离;
2.解耦生产者与消费者
生产者不需要与消费者直接打交道;
3.解决忙闲不均,提高效率
当生产者效率低下的时候,缓冲区仍有数据,不会影响消费者的消费;当消费者消费低下时生产者仍可以将生产的数据放入缓冲区;从而避免了互相等待,提高效率;
千篇文章,不如代码一行;
代码
商品类
package sx2;
/*** 商品类,包括商品品牌和名称属性;* */
public class Commodity1 {private String brand;private String name;public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public String getName() {return name;}public void setName(String name) {this.name = name;} }
仓库类(缓冲区)
package sx2;
/*** 仓库类,相当于缓冲区;* 包括商品属性,以及进库,和出库的方法;* */
public class Warehouse1 {private Commodity1 commodity1;private boolean has;//判断仓库是否有商品public Warehouse1(Commodity1 commodity1) {this.commodity1 = commodity1;}public Warehouse1() {}
// 入库与出库的方法 判断仓库是否有商品,有就出库,没有入库public synchronized void set(String brand,String name) {if(has) {try {wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}commodity1.setBrand(brand);try {Thread.sleep(300);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}commodity1.setName(name);System.out.println("入库:"+commodity1.getBrand()+commodity1.getName());notify();has=true;}public synchronized void get() {if(!has) {try {wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}System.out.println("出库:"+commodity1.getBrand()+commodity1.getName());notify();has=false;}}
生产类
package sx2;
/*** 生产者类 * */
public class Producter1 implements Runnable{private Warehouse1 warehouse1;public Producter1() {// TODO Auto-generated constructor stub}public Producter1 (Warehouse1 warehouse1){this.warehouse1 = warehouse1;}// 生产十次,奇数时生产一种商品,偶数时生产另一种商品@Overridepublic void run() {for(int i=0;i<10;i++) {if(i%2==0) {warehouse1.set("东北","冻梨"+i);}else {warehouse1.set("海南", "小芭蕉"+i);}}}}
消费类
package sx2;
/*** 消费类* */
public class Customer1 implements Runnable{private Warehouse1 warehouse1;public Customer1() {}public Customer1(Warehouse1 warehouse1) {this.warehouse1 = warehouse1;}
// 消费十次@Overridepublic void run() {for(int i=0;i<10;i++) {warehouse1.get();}}
}
测试类
package sx2;public class TestSX1 {public static void main(String[] args) {Commodity1 commodity1 = new Commodity1();Warehouse1 warehouse1 = new Warehouse1(commodity1);Producter1 p = new Producter1(warehouse1);Customer1 c = new Customer1(warehouse1);Thread t = new Thread(p);Thread t1 = new Thread(c);t1.start();t.start();}}
效果图
总结
线程并发协作也叫做线程通讯;一般用于生产者-消费者模式:
1、生产者线程与消费者线程共享同一个资源,并且互相依赖,互为条件;
2、在生产者线程的角度,再没有生产之前,需要消费者线程进入等待状态,直到生产完成后,通知消费者线程进行消费;
3、在消费者线程的角度,消费结束后,通知生产者线程继续生产,以供下一次消费;
4、在生产者-消费者问题中,光靠synchronized是不够的:
Synchronized可以阻止并发更新同一个共享资源,实现线程的同步;
Synchronized不能用来实现不同线程之间的通讯;
5、我们可以通过wait()与notify()方法实现,线程间的通讯;(wait()方法有不同的重载方法,还有notifyAll()用于唤醒所有处于等待中的线程);
6、5中提到的方法,必须要在放在同步代码块或是同步方法中否则会报异常;
(他们都是java.lang.Object类的方法)
随便说说:
终于写完了,多线程之前学习的时候没怎么学好;
这一次返回来做这一系列的文章,有感觉学到很多以前没注意的点;
最近在学Spring框架,卡在利用IOC容器管理Bean对象那了,总是报
java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext这样的异常;
试了好多方法,也找了好久就是不行;
也好这两天静静,复习一下学过的知识;
学了三个多月的编程了,还是有种云里雾里的感觉;
都说学好框架,工作就稳了,我这刚开始学框架就卡住动不了,也是有点醉了;也不知道以后能找到什么样的工作;有点期待,又有点紧张;
今天是新年的第二天了,现在许新年愿望应该不晚吧!
希望在新的一年了,自己能提高效率,找到工作,日语能力再次提升;以及祝自己身体健康,平平安安;
最后,也祝愿看到这篇文章的你,一切都往好的方面发展,平平安安,身体健康;
就说到这吧!
感谢您的观看!
多线程终极模式:生产者-消费者模式相关推荐
- Java多线程(含生产者消费者模式详解)
多线程 导航 多线程 1 线程.进程.多线程概述 2 创建线程 (重点) 2.1 继承Thread类(Thread类也实现了Runnable接口) 2.2 实现Runnable接口(无消息返回) 2. ...
- Java多线程:解决生产者/消费者模式
什么是生产者/消费者模式 生产者消费者模型具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品. 具体来说就是: 生产者 ...
- java 多线程 消费者_java中的多线程的实现生产者消费者模式
丈夫类:往银行账户里存钱,存款[0~10000)的随机数,2秒存一次 妻子类:从银行账户里取钱,取款[0~10000)的随机数,2秒取一次,如果余额不足,等到丈夫存了钱,再取 public class ...
- 单线程下的生产者--消费者模式详解,wait和sleep的区别
1. 单线程下的生产者--消费者模式 1.1 该模式下,一个线程生产数据,另一个线程处理数据.当数据还没被处理,那么生产数据的线程进入等待状态:如果数据还没生产,那么处理数据的线程进入等待状态,代码及 ...
- Java并发程序设计(十一)设计模式与并发之生产者-消费者模式
设计模式与并发之生产者-消费者模式 生产者-消费者模式是一个经典的多线程设计模式.它为多线程间的协作提供了良好的解决方案. 在生产者-消费者模式中,通常由两类线程,即若干个生产者线程和若干个消费者线程 ...
- 聊聊并发——生产者消费者模式
在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 为什么要使用生产者和消费者模式 在线程世界里,生产者就是生产数据 ...
- 并发设计模式之生产者-消费者模式
点击查看原文: http://www.joyhwong.com/2016/11/19/并发设计模式之生产者-消费者模式/ 生产者-消费者模式是一个经典的多线程设计模式,它为多线程间的协作提供了良好的解 ...
- java 生产者消费者模式_聊聊并发(十)生产者消费者模式
本文首发于InfoQ 作者:方腾飞 校对:张龙 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 为什么要使 ...
- 聊聊并发(10)生产者消费者模式
微信公众号:javafirst 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 为什么要使用生产者和消费者模式 ...
- 聊聊并发 生产者消费者模式
http://ifeve.com/producers-and-consumers-mode/ 本文首发于InfoQ 作者:方腾飞 校对:张龙 在并发编程中使用生产者和消费者模式能够解决绝大多数并 ...
最新文章
- 昇腾 OSError: [Errno 22] Invalid argument: ‘protocol‘
- 使用 AngularJS 和 ReactJS 的经验
- python+pycharm+Django报错
- python编写程序计算1+2+3+......+100和_Python3:计算两个列表总和为100的所有排列的最有效方法是什么?...
- html中把句子往右边弄一点咋办,CSS上的左,中,右对齐方法,可以在一行上混合...
- strtotime的几种用法区别
- 图论(一)—— 基本概念
- TP5的类似TP3使用‘DEFAULT_THEME’的配置修改主题风格的方法,以及常见模板错误...
- UG NX 12 使用快捷键调整视图方位
- SAS安装数据SID文件无效问题的解决
- 小型功率三极管S9013
- java进制、编码转换记录
- matlab美国标准大气,国际标准大气(ISA)
- 【Shiro权限管理】22.Shiro之记住我
- 无锁环形缓存器RingBuffer的原理
- Unity资源加载之Assetbundle(一)
- Ms Sql Server 2000 个人绿色版 5.62
- 利用FFT计算非平稳随机信号的WVD分布
- ie6 兼容整理《一》
- [华为OD]测试工程师(已过)