zoukankan      html  css  js  c++  java
  • 多线程(第三天)

    线程必须有与调用的实例的锁定,才能执行notify方法,这点跟wait方法一样(也是规则)

    notify后的线程

    被notify唤醒的线程并不是在notify的一瞬间重新开始执行。因为在notify的那一刻,执行notify的线层还握着锁定不放,所以其他线程无法获取该实例的锁定

    notify如何选择线程

    假设执行notify方法时,wait set 里正在等候的线程不只是一个。规格里并没有注明此时该选择哪一个线程。究竟是选择等待线程列表中的第一个,随即选择或是另以其他方式选择,则依java处理系统而异,因此在写程序时,程序属性最好不要写成会因所选线程而有所变动

    notifyAll  从wait set中拿出所有线程

    使用notifyAll(通知全体)方法时,会将所有在wait set里苦等的线程都拿出来,假设现在的情况是

    obj.notifyAll();

    则会唤醒所有留在实例obj的wait set 里的线程

    若实例方法写成notifyAll();

    则其意义同

    this.notifyAll();

    故这个语句所在的方法的实例(this)的wait set里的线程会全部放出来

    notify 只唤醒一个线程 ,然后该线程推出wait set     notifyAll  唤醒所有线程  让他们全部退出wait set

    跟wait 方法和notify 方法一样, 线程必须获取欲调用notifyAll方法

    被唤醒的线程边开始去获取刚才进入wait时释放掉的锁定,那么,这个锁定现在是在刚才执行notifyAll方法的线程手里

    因此即使所有线程都已经退出wait set ,但他们仍然在去获取所定的状态下,还是有阻挡,要等到刚才执行notifyAll方法的线程释放出锁定之后,其中一名幸运儿才能实际执行

    若没有锁定的线程去调用 wait notify  notifyAll 时,便会抛出异常 java.lang.IllegalMonitorStateException

    notify 和notifyAll  选择

    notifyAll所写出来的程序代码会比 notify可靠  不容易挂掉

    线程少时,notify 的程序处理速度比较快

    wait notify notifyAll 是Object 类的方法

    wait notify notifyAll都是 java.lang的Object类的方法,不是Thread类固有的方法

    obj.wait()是把现在的线程放到obj的wait set

    obj.notify()是从obj的wait set 里唤醒一个线程

    obj.notifyAll()是唤醒所有在obj的wait set 里的线程

    均解释为对实例wait set的操作,所有实例都会有 wait set 所以wait notify notifyAll才会是Object类的方法。

    三者确实不是Thread类固有的方法。不过因为 Object类是祖先类,所以 他们也是Thread类的方法

    取消线程处理的中断

    Interrupt isInterrupt interrupted interruptedException

    线程的优先级

    setPriority getPriority

    等候线程结束

    join

    有阻挡和被阻挡

    有时候线程会因为某种因素而无法继续进行下去。当线程A欲执行synchronized方法时,若其他方法已获取相同实例的锁定,则线程A无法向前推进,这个状态称为“线程A有阻挡”,,,,与被阻挡意思相同

  • 相关阅读:
    durex-word
    闲聊可穿戴设备
    闲聊质数
    一步一步学swift之:自己写Api接口-PHP
    Swift实战-小QQ(第2章):QQ侧滑菜单
    Swift实战-小QQ(第1章):QQ登录界面
    一步一步学习Swift之(一):关于swift与开发环境配置
    objective-c底层: runtime机制
    手把手教你视频直播开发
    多语言本地化开发Localized
  • 原文地址:https://www.cnblogs.com/sunshine-in/p/4075964.html
Copyright © 2011-2022 走看看