当你在试衣间试衣服,请你务必想起wait()与notify()
在学习多线程的时候,你无法逃避sleep、wait、notify、notifyAll的关键字,我们肯定是对sleep用的最多,即使你写个Demo也要经常用到Thread.sleep(xxx)模拟等待的效果,没错吧。等等,这里一道面试题来了,sleep和wait都可以表示等待,那么这两个方法有什么区别呢? 有的人不知道啥区别,他们第一反应就是搜一下,我以前就是这样的。其实吧,一个较好的方法就是看官方是怎么解释的,还有什么比这个还要权威吗? 要么就是自行Google,看看英文文档也不错,还可以提高英一下文水平,是吧。关于程序员怎么提高英文水平,我以后会专门写篇文章来讲一讲,PS:本人大学英文过了六级,毕业后我每周都花点时间学习一下,对,是每周,一直至今,所以英文水平还是不错的,目前看英文IT文档基本无障碍。
废话不多说,直接上代码
import java.util.Scanner;
public class Worker5 {
public void action1() throws InterruptedException {
synchronized (this) {
System.out.println("有人在试衣间吗?哥要试试这性感的背心 ");
wait();
System.out.println("好的,我进来了");
}
}
public void action2() throws InterruptedException {
Scanner scanner = new Scanner(System.in);
Thread.sleep(2000);
synchronized (this) {
System.out.println("姐在,你要等会儿,我正在穿衣服,不许偷看啊");
scanner.nextLine();
System.out.println("姐要马上出来了");
notify();
Thread.sleep(2000);
}
}
}

这是我写的一个小例子,是用试衣间试衣服的例子解释wait与notify的区别。action1表示一个男生的行为,action2表示一个女生的行为。而这两个行为分别被两个线程持有,取名为t1,t2,运行完就是截图的效果。 首先男生问:【有人在试衣间吗?哥要试试这性感的背心】这个肯定是要t2线程来进行回应的,但是t1t2线程已经跑起来了,怎么能让t2回应呢?就是在t1使用wait() 方法 告诉t2来回应,就是t1处于等待状态,t2来执行。当女生:【姐在,你要等会儿,我正在穿衣服,不许偷看啊】,此刻相当于t2线程在跑程序,什么时候跑完呢?为了模拟执行对话,我按个空格键,女生才会说:【姐要马上出来了】。女生换完衣服后,说一句就好了,男生只要不是聋子都能听得到,这容易啊。但是现在跑的是线程是啊,t1线程怎么知道t2跑完了,t1还在等着呢。这里t2就要用notify()方法唤醒t1线程,所以男生说:【好的,我进来了】。这里有个问题来了,你仔细想想,万一有很多个男生在外面等着进去试衣服,女生衣服换好了,就大声说一句:我换好了,你们可以进来吧(万一发生什么事,我保证不了,那画面根本不能想象啊)同理,万一是很多线程等待t2怎么办呢,他们怎么知道t2跑完了呢,这个时候不就是用notifiyAll() 来唤醒那些等待的线程吗,是吧。 好了,这么一说,对于wait notify nitifyAll还是不难的吧,如果还是不太懂,多去试衣间试试衣服然后再想想,是不是这么回事。
-------------------------------------------------------------------------------------------------------------------------------------
下一篇准备讲讲 reentrantlock 与 condition的这一对难兄难弟,学习多线程知识的确很费脑,我得喝瓶酸奶补一补,下午茶,走着!
当你在试衣间试衣服,请你务必想起wait()与notify()的更多相关文章
- 8款压箱底的Mac屏幕截图和录音录像工具软件,请你务必低调使用
以下几款是是Mac上优秀的屏幕截图.录像和录音工具,有了这些工具,在Mac上进行截屏.录制视频或者录音都会事半功倍. 1. Snagit Mac上最好用最强大的屏幕截图工具,支持各种方式的屏幕截图以及 ...
- 用生活例子来解释Java synchronized块
今天满世界的微信小程序的新闻,大家都说对于Android原生程序有构成危险了,我也不想了,以后的事谁知道呢, 我还是好好执行一下今年的计划吧. 项目刚刚上线,最近没啥事,我一直感觉自己的Java基础 ...
- 玩转Bash脚本:test測试语句
总第1篇test就是測试的意思,经常使用在流程控制语句中作为条件.以下做一下介绍. 关于真值 与其它语言不同,Bash(包含其它Shell)中,是用0表示真,非0表示假的.之所以用0表示成功,而不是1 ...
- 【原创】请不要对Boost Format使用Byte作为参数
曾几何时我们可以肆无忌惮的对sprintf传入BYTE等类型作为参数,只要你指定的为%D即可打印出对应的数字 但是boost format不可以,当你发生类型截断,错误,异常,请尽快查看你传入的类型是 ...
- Mysql的排他锁和共享锁
今天看代码看到有select name from user where id = 1 for update,有点懵逼,完全没有见过,只能说自己见识少了,那就只能学习一下.先做一下基本知识了解(大部分都 ...
- MySQL数据库InnoDB存储引擎中的锁机制
MySQL数据库InnoDB存储引擎中的锁机制 http://www.uml.org.cn/sjjm/201205302.asp 00 – 基本概念 当并发事务同时访问一个资源的时候,有可能 ...
- MySQL数据库InnoDB存储引擎中的锁机制(转载)
http://www.uml.org.cn/sjjm/201205302.asp 00 – 基本概念 当并发事务同时访问一个资源的时候,有可能导致数据不一致.因此需要一种致机制来将访问顺序化. 锁就是 ...
- Java基础——线程
一. 进程 是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程. 比如在Windows系统中,一个运行的exe就是一个进程. 二.线程 是指进程中的一个执行流 ...
- CSUST选拔赛题解
本鶸鸡于本月10号参加了蔽校的选拔赛,成绩差的死,大部分的题都是赛后花了好长时间才补出来的,其中有些题还是靠QAQorz大佬帮忙才能解决,感谢Qls对我的帮助~接下来就附带上我的暴力题解,大佬们有更好 ...
随机推荐
- Arcgis for JS实现台风运动路径与影像范围的显示
首先,看看详细的效果: 初始化状态 绘制中 绘制完毕 首先,组织数据.我组织的数据是JSON的,数据的详细形式例如以下: 其次,实现思路. 1.加入显示路径. 依据起始点,生成polyline的JSO ...
- GIMP也疯狂之动态图的制作(二)
首先看下效果: (素材丢失,无法提供) 所用工具:GIMP.GIMP-GAP(在源中直接搜索安装) 文后会添加一个从U2B上搬运过来的视频教程,效果不错,值得一看本想也制作个人物变换,但几次实验,相同 ...
- Ubuntu中改变文件的默认打开方式
其实最简单的方法是右键,在属性中修改,不过这样做没啥意义. ubuntu中与文件的打开方式相关的配置文件有四个: /etc/gnome/defaults.list 这是全局配置文件 /usr/shar ...
- Linux根目录下文件说明
/bin:存放最常用命令: /boot:启动Linux的核心文件: /dev:设备文件: /etc:存放各种配置文件: /home:用户主目录: /lib:系统最基本的动态链接共享库: /mnt:一般 ...
- mvc上传头像加剪裁功能
asp.net mvc上传头像加剪裁功能 正好项目用到上传+剪裁功能,发上来便于以后使用. 我不能告诉你们其实是从博客园扒的前台代码,哈哈. 前端是jquery+fineuploader+jquery ...
- 统计学习方法(三)——K近邻法
/*先把标题给写了.这样就能经常提醒自己*/ 1. k近邻算法 k临近算法的过程,即对一个新的样本,找到特征空间中与其最近的k个样本,这k个样本多数属于某个类,就把这个新的样本也归为这个类. 算法 ...
- SAX解析xml浅析
SAX解析XML文件采用事件驱动的方式进行,也就是说,SAX是逐行扫描文件,遇到符合条件的设定条件后就会触发特定的事件,回调你写好的事件处理程序.使用SAX的优势在于其解析速度较快,占用内存较少(相对 ...
- .NET面向对象特性之封装
.NET面向对象特性之封装 面向对象的基本内容由:类.对象.属性.方法.字段构成. 面向对象的三大特性:继承.多态.封装. 关于面向对象的特性很多人都把目光转向了继承.多态和接口,却很少有人提及过封装 ...
- Linux环境进程间通信(三):消息队列
linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...
- CSS盒子的浮动
web前端学习笔记(CSS盒子的浮动) 在标准流中,一个块级元素在水平方向会自动伸展,直到包含它的元素的边界:而在竖直方向和兄弟元素依次排列,不能并排.使用“浮动”方式后,块级元素的表现就会有所不同. ...