day87---Java多线程之线程通信

Java多线程之线程通信

1.线程通信涉及到的三个方法:

  • wait(): 一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器。

  • notify(): 一旦执行此方法,就会唤醒被wait的一个线程。如果有多个线程被wait,就唤醒优先级高的那个。

  • notifyAll(): 一旦执行此方法,就会唤醒所有被wait的线程。


2.说明:

  1. wait(),notify(),notifyAll()三个方法必须使用在同步代码块或同步方法中。

  2. wait(),notify(),notifyAll()三个方法的调用者必须是同步代码块或同步方法中的同步监视器。
    否则,会出现IllegalMonitorStateException异常

  3. wait(),notify(),notifyAll()三个方法是定义在java.lang.Object类中。


3.面试题:

面试题:sleep() 和 wait()的异同?♥♥♥

  1. 相同点:一旦执行方法,都可以使得当前的线程进入阻塞状态。

  2. 不同点:

    1. 两个方法声明的位置不同:
      1. Thread类中声明sleep() ,
      2. Object类中声明wait()
    2. 调用的要求不同:
      1. sleep()可以在任何需要的场景下调用。
      2. wait()必须使用在同步代码块或同步方法中
    3. 关于是否释放同步监视器:
      • 如果两个方法都使用在同步代码块或同步方法中,
        1. sleep()不会释放锁,
        2. wait()会释放锁。

4.锁的释放

1、释放锁的操作:

  • 当前线程的同步方法、同步代码块 执行结束
  • 当前线程在同步代码块、同步方法中 遇到break、return终止了该代码块、该方法的继续执行
  • 当前线程在同步代码块、同步方法中 出现了未处理的error或exception,导致异常结束
  • 当前线程在同步代码块、同步方法中 执行了线程对象的wait()方法,线程暂停并释放锁

2、不会释放锁的操作:

  • 线程执行同步代码块或同步方法时,程序调用Thread.sleep()、Thread.yield()方法暂停当前线程的执行
  • 【补充】线程执行代码块代码块时,其他线程调用了该线程的suspend()方法将该线程挂起,该线程不会释放锁(同步监视器)
    • 应尽量避免使用 suspend()和resume()来控制线程

……:

  • 静坐五分钟,然后朝着一个方向用力!
  • 2020年11月18日 周三 今天又下雨了
  • Java学到这里不能说学的很差吧,但学的也不算好,主要是学到这里,节奏乱了,问题出在哪里呢?我之前都是事先预习要学习的知识点的,这样在上课的时候还能向老师提出一些问题,现在完全跟着老师走确实会产生一种茫然的感觉,这样很不好,也许是最近过于放松了(农药)。还有就是我总是喜欢直接看总结好的知识点,特别不擅长自己做总结,这导致我过于看重总结的知识点,导致忽视了一些小细节,明天我要自己写出经过自己思考的出来的知识点才行。
  • 我要转变一种观念:默认的不是最好的,个性化的才是最好的。适合的才是最好的啦。不要老是想别的,要多想我的,我要改改改,让他变成属于我自己的もの。自分は自分でいい。(做自己!)
    默认的不是最好的,改改改!!!强迫症吗?啊这……
  • 一个服务为什么好,就是因为有了定制服务,个性化的服务,才会让人感到贴心。可为什么人们还是会有“就这样吧”的思想呢?哦,应该是“强扭的瓜不甜”。可是不应该是改变自己或者改变世界(基本不可能)吗【doge】。哦,这应该时每个人的标准不同,那问题又来了,是每个人有每个人的标准好呢,还是大家有一个共同的标准好呢?啊疯了疯了疯了。啊难道我是天生的哲学家【doge】。
  • 总结起来,有以下几点需要做的:
    1. 提前预习知识点,一定要走在老师的前边儿,这样才能更深入地学习(向老师及时地提出一些问题)。但是,不能上来就看总结好的知识点,这样会疏漏大量细节。有些知识点就是不敲代码不知道的。倘若提前知道了,就不会再亲手敲一敲试试了吧。
    2. 可以刷痘印,但是绝不能打游戏(太耗费精力了)。
    3. 涂涂改改的代码才是好代码。没有一笔画成画(不是简笔画,别抬杠)。不要一出现问题就想着重写(不是Override)代码,而是应该想想这个代码怎么改。谁来拯救强迫症?
posted @ 2020-11-18 23:36  zhengz  阅读(115)  评论(0)    收藏  举报