在学习多线程的时候,你无法逃避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()的更多相关文章

  1. 8款压箱底的Mac屏幕截图和录音录像工具软件,请你务必低调使用

    以下几款是是Mac上优秀的屏幕截图.录像和录音工具,有了这些工具,在Mac上进行截屏.录制视频或者录音都会事半功倍. 1. Snagit Mac上最好用最强大的屏幕截图工具,支持各种方式的屏幕截图以及 ...

  2. 用生活例子来解释Java synchronized块

    今天满世界的微信小程序的新闻,大家都说对于Android原生程序有构成危险了,我也不想了,以后的事谁知道呢, 我还是好好执行一下今年的计划吧.  项目刚刚上线,最近没啥事,我一直感觉自己的Java基础 ...

  3. 玩转Bash脚本:test測试语句

    总第1篇test就是測试的意思,经常使用在流程控制语句中作为条件.以下做一下介绍. 关于真值 与其它语言不同,Bash(包含其它Shell)中,是用0表示真,非0表示假的.之所以用0表示成功,而不是1 ...

  4. 【原创】请不要对Boost Format使用Byte作为参数

    曾几何时我们可以肆无忌惮的对sprintf传入BYTE等类型作为参数,只要你指定的为%D即可打印出对应的数字 但是boost format不可以,当你发生类型截断,错误,异常,请尽快查看你传入的类型是 ...

  5. Mysql的排他锁和共享锁

    今天看代码看到有select name from user where id = 1 for update,有点懵逼,完全没有见过,只能说自己见识少了,那就只能学习一下.先做一下基本知识了解(大部分都 ...

  6. MySQL数据库InnoDB存储引擎中的锁机制

    MySQL数据库InnoDB存储引擎中的锁机制    http://www.uml.org.cn/sjjm/201205302.asp   00 – 基本概念 当并发事务同时访问一个资源的时候,有可能 ...

  7. MySQL数据库InnoDB存储引擎中的锁机制(转载)

    http://www.uml.org.cn/sjjm/201205302.asp 00 – 基本概念 当并发事务同时访问一个资源的时候,有可能导致数据不一致.因此需要一种致机制来将访问顺序化. 锁就是 ...

  8. Java基础——线程

    一. 进程 是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程. 比如在Windows系统中,一个运行的exe就是一个进程. 二.线程 是指进程中的一个执行流 ...

  9. CSUST选拔赛题解

    本鶸鸡于本月10号参加了蔽校的选拔赛,成绩差的死,大部分的题都是赛后花了好长时间才补出来的,其中有些题还是靠QAQorz大佬帮忙才能解决,感谢Qls对我的帮助~接下来就附带上我的暴力题解,大佬们有更好 ...

随机推荐

  1. IEnumerable<T>转换为IList<SelectListItem>

    扩展方法IEnumerable<T>转换为IList<SelectListItem> ,提供@Html.DropDownList使用   由于在MVC中经常会使用到@Html. ...

  2. ASP.NET MVC之单元测试

    ASP.NET MVC之单元测试分分钟的事2014-07-15 13:05 by 书洞里的猫, 550 阅读, 4 评论, 收藏, 编辑 一.为什么要进行单元测试? 大部分开发者都有个习惯(包括本人在 ...

  3. BitMap画图

    package com.example.examples_05_07; import android.content.Context; import android.graphics.Bitmap; ...

  4. Introducing ASP.NET vNext and MVC 6

    [译]Introducing ASP.NET vNext and MVC 6 原文:http://www.infoq.com/news/2014/05/ASP.NET-vNext?utm_source ...

  5. How feedback work for your improvement

    Why generally feedback is the perspective from others for some event. In China there is story,some k ...

  6. EntityFramework中支持BulkInsert扩展

    EntityFramework中支持BulkInsert扩展 本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 前言 很显然,你应该不至于使用 Ent ...

  7. c#后台输出javascript语句和一些通用验证的类

    大家在用MVC的时候,经常会用到MODEL层的验证或者是正则表达式,我这边看到了一篇不错的文章,转载过来http://blog.csdn.net/accpxcb/article/details/311 ...

  8. IOS UI 第四篇:基本UI

    ViewController 应用   再第一个XIB页面创建另一个XIB页面,并且通过按钮调用它     - (IBAction)GoSecond:(id)sender {    secondVie ...

  9. Weblogic Server 的下载,安装配置与部署

    下载 下载页面: http://www.oracle.com/technetwork/middleware/weblogic/downloads/wls-for-dev-1703574.html 目前 ...

  10. iOS基础 - 通知中心(NSNotificationCenter)

    通知中心(NSNotificationCenter) 每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信 任何一个对象都可以向通知中心发 ...