• 18.等待唤醒机制(wait、notify)


    等待唤醒机制(waitnotify

     引言

    本节介绍一个和同步同步锁都相关的知识点,等待唤醒机制。下面从3点来介绍等待唤醒机制。

    第一点是当前线程等待,

    第二点唤醒单个等待的线程,

    第三点唤醒锁有等待的线程。

     使当前线程等待

    首先来看第一点,使当前线程等待,使用wait方法即可让当前线程等待,

    该方法只能被锁对象调用,而锁有对象都可以成为锁。所以该方法就位于OBD的类里面,锁有对象都可以调用该方法。调用该方法被中断,则引发线程中断异常。

    下面来演示该方法。自定义一个任务,任务内容是使当前线程等待,等待之后随便输出一句话,但我们知道调用wait方法需要锁,而锁必然从同步中获取。


    所以这里我们先定义一个同步代码块,同步锁为
    this,这里的this指代的就是task、对象,现在锁我们已经拿到了,下面调用锁对象的wait方法使当前线程等待。不过wait的方法有抛异常,使用try-catch捕获,之后随便输出一句话,

    下面我们来执行任务,首先将任务创建出来,然后创建一个线程,接着将任务传递给线程,最后启动线程。

    从执行结果来看,线程的确被等待,程序未结束,

     唤醒单个等待的线程

    第一点介绍完了。再来看第二点,唤醒单个等待的线程,使用notify方法就可以唤醒单个等待的线程。 


    该方法同样需要被锁对象调用,也是位于
    object类里面,下面使用notify方法,唤醒刚刚等待的线程,接着之前的程序写,为了唤醒效果更明显,使主线程休眠一秒钟,一秒钟之后才唤醒等待中的线程。刚刚的锁的对象是task对象,所以这里使用task对象调用notify方法,唤醒在该锁上等待的单个线程。不要忘了notify方法需要当前线程拥有对应的锁才可以被调用。所以调用notify方法的语句需要写在同步代码块里面,

    下面来看看执行结果。从执行结果来看,一秒钟后等待的线程被唤醒,程序结束

    为证明notify方法只能唤醒单个等待的线程。 


    我们再创建两个线程,一共是三个线程在等待。

    下面我们再来看看执行结果,从执行结果来看,只有一个线程被唤醒,只输出了一句话,还有两个线程依旧在等待,程序因还有线程未执行完而无法结束。

     唤醒所有等待的线程

    下面我们再来介绍如何唤醒所有等待的线程,使用notifyall方法就可以唤醒所有等待的线程,该方法同样需要被锁对象调用,也是位于object类里面。

    下面使用notifyall方法唤醒刚刚所有等待的线程,改写之前的程序,将notify方法换成notifyall方法即可。 

     


    下面再来看看执行结果,从执行结果来看,所有线程被唤醒。还输出了三句话程序也结束了


     总结

    最后来总结一下本节的内容。本节介绍了与同步同步锁相关的等待唤醒机制,这里列举了5个方法,其中前3个方法和等待相关,后2个方法和唤醒相关,wait方法的作用是使当前线程等待,它还有两个重载方法可以指定等待超时时间,若等待超时则自动唤醒。notify方法的作用,是唤醒单个等待的线程,notifyall方法的作用是唤醒所有等待的线程,在实际开发中以上方法经常被使用。 

      

    附录:

    笔记完整文本:

    本节介绍一个和同步同步锁都相关的知识点,等待唤醒机制。下面从3点来介绍等待唤醒机制。第一点是当前线程等待,第二点唤醒单个等待的线程,第三点唤醒锁有等待的线程。首先来看第一点,使当前线程等待使用wait方法即可让当前线程等待,该方法只能被锁对象调用,而锁有对象都可以成为锁。锁以该方法就位于OBD的类里面锁有对象都可以调用该方法调用该方法被中断,则引发线程中断异常。下面来演示该方法。自定义一个任务任务内容是使当前线程等待,等待之后随便说出一句话,但我们知道调用wait方法需要锁,而锁必然从同步中获取。 锁以这里我们先定义一个同步代码块,同步锁为zs,这里的js指代的就是task、对象,现在锁我们已经拿到了,下面调用锁对象的wait方法使当前线程等待。不过胃的方法有Paul异常,使用踹开启将其补后,之后随便说出一句话,下面我们来执行任务,首先将任务创建出来,然后创建一个线程,接着将任务传递给scheme,最后启动线程。从执行结果来看,线程的确被等待,程序未结束,第一点介绍完了。再来看第二点,唤醒单个等待的线程,使用裸体反应方法就可以唤醒单个等待的线程。 该方法同样需要被锁对象调用,也是位于object类里面下面使用not方法,唤醒刚刚等待的县城,接着之前的程序写,为了唤醒效果更明显,使主线程休眠一秒钟,一秒钟之后才唤醒等待中的线程。刚刚的,手对象是task对象,锁以这里使用task对象调用落体法方法,唤醒在该锁上等待的三个,县城不要忘了Lotty five方法需要当前线程拥有对应的锁才可以被调用。锁以调用裸体反方法的语句需要写在同步大板块里面,下面来看看执行结果。从执行结果来看,一秒钟后等待的线程被唤醒程序结束,为证明notify方法只能唤醒单个等待的线程。 我们再创建两个线程,一共是三个线程在等待。下面我们再来看看执行结果,从执行结果来看,只有一个线程被唤醒,只输出了一句话,还有两个线程依旧在等待程序,因还有线程未执行完而无法结束。下面我们再来介绍如何唤醒锁有等待的线程,使用notify all方法就可以唤醒锁有等待的线程,该方法同样需要被锁对象调用,也是位于or接到类里面。下面使用notify all方法唤醒刚刚锁有等待的线程,改写之前的程序,将note if I方法换成note,if I awe方法即可。 下面再来看看执行结果,从执行结果来看,锁有线程被唤醒还说出了,三句话程序也结束了,最后来总结一下本节的内容。本节介绍了与同步同步锁相关的等待唤醒机制,这里列举了5个方法,其中前3个方法和等待相关后2个方法和唤醒相关wait方法的作用是使当前线程等待它还有两个重载方法可以指定等待超时时间,若等待超时则自动唤醒note方法的作用,是唤醒单个等待的线程,note方法的作用是唤醒锁有等待的线程在实际开发中以上方法经常被使用。

     

  • 相关阅读:
    GZS与小公园(DFS)
    II play with GG(思维规律)
    bearBaby loves sleeping(BFS)
    湖南大学新生赛C,G,J题解
    bootstrap 标签页的使用(tab)
    js 循环生成元素,并为元素添加click事件,结果只执行最后一个点击事件
    使用原生js实现一个列表数据展示页面不同的项目状态使整行显示不同颜色。
    【Vue】详解Vue组件系统 目录
    基于TCP与UDP协议的socket通信
    ElementUI三级菜单checkBox全选实现
  • 原文地址:https://www.cnblogs.com/cj8357475/p/16086046.html
Copyright © 2020-2023  润新知