多线程(第三天)

线程必须有与调用的实例的锁定,才能执行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有阻挡”,,,,与被阻挡意思相同

原文地址:https://www.cnblogs.com/sunshine-in/p/4075964.html