• 当你在试衣间试衣服,请你务必想起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的这一对难兄难弟,学习多线程知识的确很费脑,我得喝瓶酸奶补一补,下午茶,走着!

     

  • 相关阅读:
    Android studio 报错 installation failed with message failed to finalize session:INSTALL_FAILED_INVALID_APK 解决方法
    Python 爬虫入门实例(爬取小米应用商店的top应用apk)
    解决jenkins控制台中文乱码问题
    四.Jenkins的授权和访问控制
    三.jenkins 在windows上配置master 和 agent(slave)
    Jenkins 默认没有Launch agent via Java Web Start,该如何配置
    二.jenkins构建自动化任务
    一.Jenkins的windows安装
    maven仓库地址配置
    jvm linux 时区设置
  • 原文地址:https://www.cnblogs.com/tleopard/p/6273555.html
Copyright © 2020-2023  润新知