并发协作模型“生产者/消费者模式“
- java提供了几个方法解决线程之间的通信问题
方法名 | 作用 |
---|---|
wait() | 表示线程一直等待,直到其他线程通知,与sleep不同,会释放锁 |
wait(long timeout) | 指定等待的毫秒数 |
notify | 唤醒一个处于等待状态的线程 |
notifyAll() | 唤醒同一个对象上所有调用wait()方法的线程,优先级别高的线程调度 |
注意:均是Object类的方法,都只能在同步方法或者同步代码块中使用,否则会抛出异常InterruptedException
管程法
- 生产者:负责生产数据的模块(可能是方法,对象,线程,进程);
- 消费者:负责处理数据的模块(可能是方法,对象,线程,进程);
- 缓冲区:消费者不能直接使用生产者的数据,他们之间有个”缓冲区“
生产者将生产好的数据放入缓冲区,消费者从缓冲区拿出数据
package com.zeng.thread;
//测试:生产者消费者模型-->利用缓冲区解决:管程法
//生产者,消费者,产品,缓冲区
public class TestPC {public static void main(String[] args) {SynContainer container=new SynContainer();new Productor(container).start();new Consumer(container).start();}
}//生产者
class Productor extends Thread{SynContainer container;public Productor(SynContainer container) {//构造器this.container=container;}//生产@Overridepublic void run() {for (int i = 0; i < 100; i++) {container.push(new Chicken(i));System.out.println("生产了"+i+"只鸡");}}
}
//消费者
class Consumer extends Thread{SynContainer container;public Consumer(SynContainer container){this.container=container;}@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println("消费了"+container.pop().id+"只鸡");}}
}//产品
class Chicken{int id;public Chicken(int id){this.id=id;}
}//缓冲区
class SynContainer{//需要一个容器大小Chicken[] chickens=new Chicken[10];//容器计数int count=0;//生产者放入产品public synchronized void push(Chicken chicken){//如果容器满了,就需要等待消费者消费if(count==chickens.length){//通知消费者消费,生产等待try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}chickens[count]=chicken;count++;//可以通知消费者消费了this.notifyAll();}//消费者消费产品public synchronized Chicken pop(){//判断能否消费if(count==0){//等待生产者生产,消费者等待try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}//如果可以消费count--;Chicken chicken=chickens[count];//吃完了,通知生产者生产this.notifyAll();return chicken;}
}
信号灯法
package com.zeng.thread;
//测试生产者消费者问题2:信号灯法,标志位解决
public class TestPC2 {public static void main(String[] args) {TV tv=new TV();new Player(tv).start();new Watcher(tv).start();}
}//生产者:演员
class Player extends Thread{TV tv;public Player(TV tv){this.tv=tv;}@Overridepublic void run() {for (int i = 0; i < 10; i++) {if(i%2==0){this.tv.play("披荆斩棘的哥哥播放中");}else{this.tv.play("明星大侦探");}}}
}//消费者:观众
class Watcher extends Thread{TV tv;public Watcher(TV tv){this.tv=tv;}@Overridepublic void run() {for (int i = 0; i < 10; i++) {tv.watch();}}
}//产品——>节目
class TV{//演员表演,观众等待T//观众观看,演员等待FString voice;//表演的节目boolean flag =true;//表演public synchronized void play(String voice){if(!flag){try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("演员表演了:"+voice);//通知观众观看this.notifyAll();//通知唤醒this.voice=voice;this.flag=!this.flag;}//观看public synchronized void watch(){if(flag){try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("观看了:"+voice);//通知演员表演this.notifyAll();this.flag=!this.flag;}
}
并发协作模型“生产者/消费者模式“相关推荐
- Java并发编程实战~生产者-消费者模式
前面我们在<Worker Thread 模式>中讲到,Worker Thread 模式类比的是工厂里车间工人的工作模式.但其实在现实世界,工厂里还有一种流水线的工作模式,类比到编程领域,就 ...
- 并发设计模式之生产者-消费者模式
点击查看原文: http://www.joyhwong.com/2016/11/19/并发设计模式之生产者-消费者模式/ 生产者-消费者模式是一个经典的多线程设计模式,它为多线程间的协作提供了良好的解 ...
- delphi生产者消费者模式代码_并发设计模式:生产者-消费者模式,并发提高效率...
生产者 - 消费者模式在编程领域的应用非常广泛,前面我们曾经提到,Java 线程池本质上就是用生产者 - 消费者模式实现的,所以每当使用线程池的时候,其实就是在应用生产者 - 消费者模式. 当然,除了 ...
- 多线程-并发编程(7)-生产者消费者模式及非阻塞队列与阻塞队列实现
生产者消费者模式是一个十分经典的多线程协作模式 弄懂生产者消费者问题能够让我们对多线程编程的理解更加深刻 存在3个元素 1.生产者(类比厨师) 2.生产者的生产产品(类比美食) 3.消费者(类比吃货) ...
- java消费者生产者设计模式_java 多线程并发设计模式之四: 生产者消费者模式
生产者消费者模式是一个经典的多线程设计模式,其核心思想是:有两类线程和一个内存缓冲区或者队列, 一类线程发起任务,并提交到队列中.另一类线程用来处理这些任务,叫做消费者线程. 这两类线程进行通信的桥梁 ...
- Java并发编程(二十三)------并发设计模式之生产者消费者模式
参考文章:Java实现生产者消费者问题与读者写者问题 目录 1. 生产者消费者问题 1.1 wait() / notify()方法 1.2 await() / signal()方法 1.2.1 对sy ...
- [19/04/11-星期四] 多线程_并发协作(生产者/消费者模式_2种解决方案(管程法和信号灯法))...
一.概念 多线程环境下,我们经常需要多个线程的并发和协作.这个时候,就需要了解一个重要的多线程并发协作模型"生产者/消费者模式". Ø 什么是生产者? 生产者指的是负责生产数据的模 ...
- Java(二十二) -- 生产者消费者模式
目录 生产者消费者模式 汉堡类 容器类 生产者 消费者 测试类 案例:多线程并发卖票 生产者消费者模式 在一个生产环境中,生产者和消费者在同一时间段内共享同一块缓冲区,生产者负责向缓冲区添加数据,消费 ...
- java实现生产者消费者模式
一: 什么是生产者消费者模型 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直 ...
最新文章
- 【SRM 716 DIV 1 A】 ConstructLCS
- Bit-Z如何注册?【新手操作指南】
- Python的国际化
- 卷积神经网络经典模型要点
- [改善Java代码]不要覆写静态方法
- java阻塞队列作用_简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用...
- 织梦响应式教育机构官网网站模板
- cmd中安装app的的命令
- python 第13章:面向对象编程
- JS设置弹出小窗口。
- javascript中事件
- Luogu P1455 搭配购买 题解
- eltable表头高度无法设置_厨房吊顶高度一般多少?厨房吊顶安装需要注意什?...
- 【LaTeX安装】如何在windows电脑上安装 texlive2021
- 【程序员的吃鸡大法】利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏...
- 概率图模型(PGM):贝叶斯网(Bayesian network)初探
- 决策树及matlab实现
- Spark DataFrame 写入HIve 出现HiveFileFormat`. It doesn't match the specified format `ParquetFileFormat`
- FI---SAP汇率损益处理方法
- [JZOJ5594][min25筛]最大真因数
热门文章
- LeetCode之First Unique Character in a String
- 剑指offer之反向打印链表值
- Windows之Wireshake之抓HTTP请求包(过滤目的IP)
- linux之vim操作快速跳到下一个空格和上一个空格命令
- LeetCode之Merge Sorted Array
- C++编译出现binding ‘const string {aka const std::__cxx11::basic_string<char>}’ to reference of type ‘std
- linux之telnet命令使用
- Android之基于xmpp openfire smack开发之Android消息推送技术原理分析和实践[4]
- html地区三级联下拉列表,JS-三级联下拉列表
- cvtcolor python opencv_二值分析 | OpenCV + skimage如何提取中心线