信号灯法:以一个标志位来判断是否执行还是等待

public class TV {
private String voice; //内容
private boolean flag=false; //信号灯,true表示观众可以看电视啦,false表示演员可以表演啦
//演员表演
public synchronized void play(String voice){
if(flag==true){ //true表示演员等待,观众观看
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//可以表演,此时flag=false
System.out.println("表演了"+voice);
this.voice=voice;
flag=!flag; //表演完毕,改变flag=true,通知观众观看,同时让演员停止表演
this.notifyAll(); //通知观众观看
}
//观众观看
public synchronized void watch(){
if(flag==false){ //false,观众不能观看
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//可以观看,此时flag=true;
System.out.println("观看了"+voice);
flag=!flag; //观看完毕,改变flag=false
this.notifyAll();
}
}
public class Player implements Runnable{
private TV tv; public Player(TV tv) {
this.tv = tv;
} @Override
public void run() {
for (int i = 0; i < 20; i++) {
if(i%2==0){
tv.play("中国好声音:"+i);
}else{
tv.play("中国有嘻哈:"+i);
}
}
}
}
public class Audience implements Runnable{
private TV tv; public Audience(TV tv) {
this.tv = tv;
} @Override
public void run() {
for (int i = 0; i < 20; i++) {
tv.watch();
}
}
}
public class TvTest {
public static void main(String[] args) {
TV tv=new TV();
Player player=new Player(tv);
Audience audience=new Audience(tv);
new Thread(player).start();
new Thread(audience).start();
}
}

Java多线程学习——wait方法(信号灯法/生产者消费者模式)的更多相关文章

  1. Java多线程-同步:synchronized 和线程通信:生产者消费者模式

    大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同 ...

  2. Java多线程使用wait和notify实现生产者消费者模型

    Java多线程使用wait和notify这两个关键字的学习,通过实现生成者与消费者来成对研究比较科学. 从两个字的意义来讲就是等待与通知这个简单道理. 现在先模拟一个缓存区存储,是用一个list实现的 ...

  3. Java 学习笔记 使用synchronized实现生产者消费者模式

    说明 Object.wait()使当前的线程进入到等待状态(进入到等待队列) Object.notifyAll() 唤醒等待中的全部线程 Object.notify() 随机唤醒一个线程 代码 con ...

  4. Java多线程学习——wait方法(管道法/生产者消费者模式)

    简单介绍管道法: 生产者生产数据输送到管道,消费者从管道拿出数据,管道为空消费者等待,管道满生产者生产,消费者消费生产者生产,生产者生产消费者消费. public class Corn { //要生产 ...

  5. Java多线程学习——join方法的使用

    join在线程里面意味着“插队”,哪个线程调用join代表哪个线程插队先执行——但是插谁的队是有讲究了,不是说你可以插到队头去做第一个吃螃蟹的人,而是插到在当前运行线程的前面,比如系统目前运行线程A, ...

  6. Java 多线程学习笔记:生产者消费者问题

    前言:最近在学习Java多线程,看到ImportNew网上有网友翻译的一篇文章<阻塞队列实现生产者消费者模式>.在文中,使用的是Java的concurrent包中的阻塞队列来实现.在看完后 ...

  7. Java实现多线程生产者消费者模式的两种方法

    生产者消费者模式:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据.生产者生产一个,消费者消费一个,不断循环. 第一种实现方法,用BlockingQueue阻塞队 ...

  8. .net学习之多线程、线程死锁、线程通信 生产者消费者模式、委托的简单使用、GDI(图形设计接口)常用的方法

    1.多线程简单使用(1)进程是不执行代码的,执行代码的是线程,一个进程默认有一个线程(2)线程默认情况下都是前台线程,要所有的前台线程退出以后程序才会退出,进程里默认的线程我们叫做主线程或者叫做UI线 ...

  9. 2.5多线程(Java学习笔记)生产者消费者模式

    一.什么是生产者消费者模式 生产者生产数据存放在缓冲区,消费者从缓冲区拿出数据处理. 可能大家会问这样有何好处? 1.解耦 由于有了缓冲区,生产者和消费者之间不直接依赖,耦合度降低,便于程序拓展和维护 ...

随机推荐

  1. Webdriver处理页面元素的方式

    Webdriver执行JavaScript代码的方式 WebDriver driver = new ChromeDriver(); JavascriptExecutor jse = (Javascri ...

  2. Python修炼之路-Socket

    网络编程 socket套接字 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过“套接字”向网络发出请求或者应答网络请求. socket ...

  3. event loop 与 vue

    结论 对于event loop 可以抽象成一段简单的代码表示 for (macroTask of macroTaskQueue) { // 1. Handle current MACRO-TASK h ...

  4. h5页面弹窗时页面固定(弹窗下面的页面不滑动)

    页面出现弹窗时,底部页面不能随之滑动怎么解决? 只需将页面的body增加一个样式 overflow:hidden;就能解决 jq: //开启弹窗 $('body').attr('style','ove ...

  5. java基础语法3 方法

    方法的定义-方法的特点 -方法的应用-方法的重载-数组定义-数组初始化-二维数组-Java中参数传递的特点:值传递 7.方法 7.1 方法的定义 什么是方法?Method方法就是定义在类中的,具有特定 ...

  6. CodeForces-721C-Journey(DAG, DP)

    链接: https://vjudge.net/problem/CodeForces-721C 题意: Recently Irina arrived to one of the most famous ...

  7. 2018山东省赛 H Dominoes ( 搜索 )

    题目链接 题意 : 给出一个 n * m 的矩阵,用规格 1 * 2 的多米诺去填充,题目数据保证最后只有一个格子是空白的(即没有被多米诺骨牌覆盖),问你现在通过移动多米诺能够产生多少种不同的状态(空 ...

  8. Logstash的filter插件介绍

    一 官网说明 过滤器插件对事件执行中介处理.通常根据事件的特征有条件地应用过滤器. 以下过滤器插件在下面可用. Plugin Description Github repository aggrega ...

  9. mysql忘记root登录密码

    没有过忘记密码的程序员是不完美的,对于Oracle忘记密码可以设置orapwdfile文件, Mysql其中一种方法是通过修改文件免密然后再进行密码的修改: 1.忘记密码 [root@leader ~ ...

  10. 在MyEclipse安装Spket插件,用于jQuery代码提示

    Spket插件下载: https://pan.baidu.com/s/1sjz24NF 解压文件,然后将解压后的文件全部复制到MyEclipse安装目录下的dropins包中,重启MyEclipse. ...