Java多线程_并发协助模型(管制法,信号灯法)
管制法
- 生产者:负责生产数据的模型(可能是方法,对象,线程,进程)
- 消费者: 负责处理数据的模块(可能是方法,对象,线程,进程)
- 缓存区: 消费者不能直接使用生产者的数据 ,他们之间有个“缓冲区”
总结:生产者将生产好的数据放入到缓冲区,消费者从缓冲区拿数据
代码例子:
//测试: 生产者消费者模型 --> 利用缓冲区解读:管制发
//生产者,消费者,产品,缓冲区
public class TestPC {public static void main(String[] args) {SynContainer synContainer = new SynContainer();new Productor(synContainer).start();new Consumer(synContainer).start();}
}//生产者
class Productor extends Thread{SynContainer synContainer;@Overridepublic void run(){for (int i = 1; i <= 100; i++) {System.out.println("生产了"+i+"只鸡");synContainer.push(new Chicken(i));}}public Productor(SynContainer synContainer){this.synContainer = synContainer;}
}//消费者
class Consumer extends Thread{SynContainer synContainer;@Overridepublic void run(){for (int i = 1; i <= 100; i++) {System.out.println("消费了"+synContainer.pop().id+"只鸡");}}public Consumer(SynContainer synContainer){this.synContainer = synContainer;}
}//产品
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;}
}
信号灯法
型号灯法,是一个通过标识位来控制线程之间的切换。
//测试生产者消费者问题2:型号灯发,标志位解决
public class TestSignalLamp {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 < 20; i++) {if(i%2 == 0) {this.tv.play("快乐星"+i);}else{this.tv.play("社会与法"+i);}}}}//消费者 --> 观众
class Watcher extends Thread{TV tv;public Watcher(TV tv){this.tv = tv;}@Overridepublic void run(){for (int i = 0; i < 20; i++) {tv.watch();}}
}//产品 -->电视节目
class TV{//演员录制节目的时候,观众等待节目录制完成//等观众观看演员录制的节目的时候,演员等待下一个节目的开拍String voice;boolean flag = Boolean.TRUE;//表演public synchronized void play(String vice){if(!flag) {System.out.println("观众正在查看上次录制的表演,请等待");try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("演员的节目录制好了"+vice);//打预告,通知观众准备观看this.notifyAll();this.voice = vice;this.flag = !this.flag;}//观看public synchronized void watch() {if(flag){System.out.println("节目正在录制,无法观看");try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("观看了"+ voice);//观看完了,通知演员准备录制新节目this.notifyAll();this.flag = !this.flag;}
}
Java多线程_并发协助模型(管制法,信号灯法)相关推荐
- java书籍_还搞不定Java多线程和并发编程面试题?你可能需要这一份书单!
点击蓝色"程序员书单"关注我哟 加个"星标",每天带你读好书! 在介绍本书单之前,我想先问一下各位读者,你们之前对于Java并发编程的了解有多少呢.经过了1 ...
- Java多线程与并发库高级应用--18_传智播客_张孝祥_java5阻塞队列的应用
Java多线程与并发库高级应用--18_传智播客_张孝祥_java5阻塞队列的应用 原创:徐工 2018-5- 5 17.10 package cn.itcast.heima2; import jav ...
- java多线程与并发_漫画 | Java多线程与并发(一)
1.什么是线程? 2.线程和进程有什么区别? 3.如何在Java中实现线程? 4.Java关键字volatile与synchronized作用与区别? volatile修饰的变量不保留拷贝,直接访问主 ...
- Java 多线程与并发编程专题
Java 线程基础 Java 多线程开发 线程安全与同步 并发控制 非阻塞套接字(NIO) Java 5 中的并发 JDK 7 中的 Fork/Join 模式 相关书评 Java 平台提供了一套广泛而 ...
- JAVA多线程和并发面试问题
转载自 JAVA多线程和并发面试问题 Java多线程面试问题 1.进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程 ...
- JAVA多线程和并发基础面试问答(转载)
JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...
- java多线程与并发原理
三.java多线程与并发原理 1.进程和线程的区别: 进程和线程的由来: (1)串行:初期的计算机只能串行执行任务,并且需要长时间等待用户输入: (2)批处理:预先将用户的指令集集中成清单,批量串行处 ...
- Java多线程与并发相关 — 原理
Java多线程与并发相关 - 原理 一 synchronized同步 1. 线程安全问题的主要诱因? 存在共享资源(也称临界资源); 存在多条线程共同操作这些共享数据; 2. 解决办法. 同一时刻有且 ...
- JAVA Java多线程与并发库
Java多线程与并发库 同步方式 import javax.xml.stream.events.StartDocument;public class TestSynchronized {public ...
- java 多线程写缓存,Java多线程_缓存对齐
1.什么是缓存对齐 当前的电脑中,数据存储在磁盘上,可以断电保存,但是读取效率较低.不断电的情况下,数据可以在内存中存储,相对硬盘效率差不多是磁盘的一万倍左右.但是运算时,速度最快的是直接缓存在CPU ...
最新文章
- Oozie中允许hive程序xml配置
- jQuery的Growl插件
- 优秀的程序员是那种过单行线马路都要往两边看的人
- 编程填空:学生信息处理程序_项目学生:业务层
- 父组件更新prop_如何在ReactJS中更新组件的prop —哦,是的,有可能
- Liferay CE 6.1安装教程
- amazeui学习笔记--css(基本样式2)--基础设置Base
- Odoo链接magento纪实
- skills --札记
- 【Augmented Reality】增强现实中的光学透射式头盔显示器的标定深入
- Javascript中括号“[]”的多义性
- react中创建组件的三种方法
- 置换矩阵、转置矩阵以及向量空间、子空间
- 2021美团校招(一)
- 阿里巴巴icon在vue项目中使用方法
- php获取判断图片大小,php 获取图片尺寸的方法
- Primeng修改组件样式
- 什么是JSON(详解)
- 常见的机器学习数据挖掘知识点
- 怎么培养孩子的金钱观