管制法

  1. 生产者:负责生产数据的模型(可能是方法,对象,线程,进程)
  2. 消费者: 负责处理数据的模块(可能是方法,对象,线程,进程)
  3. 缓存区: 消费者不能直接使用生产者的数据 ,他们之间有个“缓冲区”

总结:生产者将生产好的数据放入到缓冲区,消费者从缓冲区拿数据

代码例子:


//测试: 生产者消费者模型 --> 利用缓冲区解读:管制发
//生产者,消费者,产品,缓冲区
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多线程_并发协助模型(管制法,信号灯法)相关推荐

  1. java书籍_还搞不定Java多线程和并发编程面试题?你可能需要这一份书单!

    点击蓝色"程序员书单"关注我哟 加个"星标",每天带你读好书! ​ 在介绍本书单之前,我想先问一下各位读者,你们之前对于Java并发编程的了解有多少呢.经过了1 ...

  2. Java多线程与并发库高级应用--18_传智播客_张孝祥_java5阻塞队列的应用

    Java多线程与并发库高级应用--18_传智播客_张孝祥_java5阻塞队列的应用 原创:徐工 2018-5- 5 17.10 package cn.itcast.heima2; import jav ...

  3. java多线程与并发_漫画 | Java多线程与并发(一)

    1.什么是线程? 2.线程和进程有什么区别? 3.如何在Java中实现线程? 4.Java关键字volatile与synchronized作用与区别? volatile修饰的变量不保留拷贝,直接访问主 ...

  4. Java 多线程与并发编程专题

    Java 线程基础 Java 多线程开发 线程安全与同步 并发控制 非阻塞套接字(NIO) Java 5 中的并发 JDK 7 中的 Fork/Join 模式 相关书评 Java 平台提供了一套广泛而 ...

  5. JAVA多线程和并发面试问题

    转载自   JAVA多线程和并发面试问题 Java多线程面试问题 1.进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程 ...

  6. JAVA多线程和并发基础面试问答(转载)

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  7. java多线程与并发原理

    三.java多线程与并发原理 1.进程和线程的区别: 进程和线程的由来: (1)串行:初期的计算机只能串行执行任务,并且需要长时间等待用户输入: (2)批处理:预先将用户的指令集集中成清单,批量串行处 ...

  8. Java多线程与并发相关 — 原理

    Java多线程与并发相关 - 原理 一 synchronized同步 1. 线程安全问题的主要诱因? 存在共享资源(也称临界资源); 存在多条线程共同操作这些共享数据; 2. 解决办法. 同一时刻有且 ...

  9. JAVA Java多线程与并发库

    Java多线程与并发库 同步方式 import javax.xml.stream.events.StartDocument;public class TestSynchronized {public ...

  10. java 多线程写缓存,Java多线程_缓存对齐

    1.什么是缓存对齐 当前的电脑中,数据存储在磁盘上,可以断电保存,但是读取效率较低.不断电的情况下,数据可以在内存中存储,相对硬盘效率差不多是磁盘的一万倍左右.但是运算时,速度最快的是直接缓存在CPU ...

最新文章

  1. Oozie中允许hive程序xml配置
  2. jQuery的Growl插件
  3. 优秀的程序员是那种过单行线马路都要往两边看的人
  4. 编程填空:学生信息处理程序_项目学生:业务层
  5. 父组件更新prop_如何在ReactJS中更新组件的prop —哦,是的,有可能
  6. Liferay CE 6.1安装教程
  7. amazeui学习笔记--css(基本样式2)--基础设置Base
  8. Odoo链接magento纪实
  9. skills --札记
  10. 【Augmented Reality】增强现实中的光学透射式头盔显示器的标定深入
  11. Javascript中括号“[]”的多义性
  12. react中创建组件的三种方法
  13. 置换矩阵、转置矩阵以及向量空间、子空间
  14. 2021美团校招(一)
  15. 阿里巴巴icon在vue项目中使用方法
  16. php获取判断图片大小,php 获取图片尺寸的方法
  17. Primeng修改组件样式
  18. 什么是JSON(详解)
  19. 常见的机器学习数据挖掘知识点
  20. 怎么培养孩子的金钱观

热门文章

  1. 关于NTFS数据流ADS的详细介绍
  2. 运维审计新形势下CIO的管理职责
  3. 200 OK(from memory cache)和 200 OK(from disk cache)
  4. QQ邮箱如何快速批量删除所有的垃圾邮件
  5. echarts markline X轴 Y轴 添加标识线
  6. 根据身份证号判断年龄
  7. 深度学习之卷积神经网络
  8. JavaTutorials之Operators
  9. 热更新应用--热补丁Hotfix学习笔记
  10. 计算机应用专科学年鉴定表,计算机应用技术专业学生大一学年自我鉴定.docx