Java多线程学习——wait方法(信号灯法/生产者消费者模式)
信号灯法:以一个标志位来判断是否执行还是等待
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方法(信号灯法/生产者消费者模式)的更多相关文章
- Java多线程-同步:synchronized 和线程通信:生产者消费者模式
大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同 ...
- Java多线程使用wait和notify实现生产者消费者模型
Java多线程使用wait和notify这两个关键字的学习,通过实现生成者与消费者来成对研究比较科学. 从两个字的意义来讲就是等待与通知这个简单道理. 现在先模拟一个缓存区存储,是用一个list实现的 ...
- Java 学习笔记 使用synchronized实现生产者消费者模式
说明 Object.wait()使当前的线程进入到等待状态(进入到等待队列) Object.notifyAll() 唤醒等待中的全部线程 Object.notify() 随机唤醒一个线程 代码 con ...
- Java多线程学习——wait方法(管道法/生产者消费者模式)
简单介绍管道法: 生产者生产数据输送到管道,消费者从管道拿出数据,管道为空消费者等待,管道满生产者生产,消费者消费生产者生产,生产者生产消费者消费. public class Corn { //要生产 ...
- Java多线程学习——join方法的使用
join在线程里面意味着“插队”,哪个线程调用join代表哪个线程插队先执行——但是插谁的队是有讲究了,不是说你可以插到队头去做第一个吃螃蟹的人,而是插到在当前运行线程的前面,比如系统目前运行线程A, ...
- Java 多线程学习笔记:生产者消费者问题
前言:最近在学习Java多线程,看到ImportNew网上有网友翻译的一篇文章<阻塞队列实现生产者消费者模式>.在文中,使用的是Java的concurrent包中的阻塞队列来实现.在看完后 ...
- Java实现多线程生产者消费者模式的两种方法
生产者消费者模式:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据.生产者生产一个,消费者消费一个,不断循环. 第一种实现方法,用BlockingQueue阻塞队 ...
- .net学习之多线程、线程死锁、线程通信 生产者消费者模式、委托的简单使用、GDI(图形设计接口)常用的方法
1.多线程简单使用(1)进程是不执行代码的,执行代码的是线程,一个进程默认有一个线程(2)线程默认情况下都是前台线程,要所有的前台线程退出以后程序才会退出,进程里默认的线程我们叫做主线程或者叫做UI线 ...
- 2.5多线程(Java学习笔记)生产者消费者模式
一.什么是生产者消费者模式 生产者生产数据存放在缓冲区,消费者从缓冲区拿出数据处理. 可能大家会问这样有何好处? 1.解耦 由于有了缓冲区,生产者和消费者之间不直接依赖,耦合度降低,便于程序拓展和维护 ...
随机推荐
- 在Scrapy里设置Cookies 要注意一点!
1.requests里设置cookies,可以将cookies放入headers里一同提交. {'Accept': 'text/html,application/xhtml+xml,applicati ...
- (转)MyBatis 一、二级缓存和自定义缓存
1.一级缓存 MyBatis 默认开启了一级缓存,一级缓存是在SqlSession 层面进行缓存的.即,同一个SqlSession ,多次调用同一个Mapper和同一个方法的同一个参数, 只会进行一次 ...
- 生成不带版本的jar包 不影响deploy
1 How to build maven project without version? 工程pom中增加 <project> ... <build> ... <fin ...
- mysqldump导出时 --set-gtid-purged=OFF
mysqldump导出表 [root@bj db10044]# rpm -qf `which mysqldump`Percona-Server-client-56-5.6.22-rel71.0.el6 ...
- SpringMVC初识
1 SpringMVC的概述 Spring为展现层提供的基于MVC设计理念的优秀的web框架,是目前最主流的MVC框架之一. Spring3.0后面全面超过Struts2,成为了最优秀的MVC框架. ...
- notepad++文档格式转化window、unix、MAC
切换
- 【Linux】CentOS6上redis安装
1.官网下载安装包 https://redis.io 2.解压 tar -zxvf xxxx.tar.gz 3.编译安装 进入解压后的目录后 make 出现以下内容表示make成功 Hint: It' ...
- Java+超大文件上传
之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...
- Codeforces 950E Data Center Maintenance ( 思维 && 强连通分量缩点 )
题意 : 给出 n 个点,每个点有一个维护时间 a[i].m 个条件,每个条件有2个点(x,y)且 a[x] != a[y].选择最少的 k (最少一个)个点,使其值加1后,m个条件仍成立. 分析 : ...
- CDOJ 1060 秋实大哥与快餐店 字典树 水题
题目链接 B - 秋实大哥与快餐店 Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%lld & %llu Sub ...