wait,notify,sleep,yield,join,interrupt,isInterrupted 方法总结

java 多线程相关方法总结(wait,notify,sleep,yield,join,interrupt,isInterrupted ,synchronized 代码块和方法)

java 中 object 对象的隐藏属性——monitor 和 wait set.

java中 任何一个对象 都有以上两个涉及到 多线程并发 方面的隐藏属性。监视器 和 等待队列。 



有些方法执行时,需要拥有对象的锁。
wait,notify 这类方法执行时,必须拥有对象的锁。

因为他们涉及到 释放锁的操作。

获取对象锁的方法————————synchronized 代码块和方法
synchronized 代码块 :锁对象自己设置。
synchronized方法 : 实例方法 ————锁对象是实例。(Thread.join()使用的所对象 就是 thread objcet) 
                                    静态方法————所对象是 类实例。

wait方法, 当前线程暂停执行, 释放掉 其获取的对象的 monitor.并将当前线程插入到 waitset 等待队列中,由于需要释放锁。所以该方法执行时,必须先拥有
锁,也就是 该方法必须在synchronized 代码块和方法 中进行调用。
notify.  当前线程 唤醒 对象等待线程中的一个 线程 继续执行。当然 改方法不会暂停执行,会一直执行完,然后再释放自己获得的锁。(如果不释放锁,唤醒的线程 也无法继续执行,因为唤醒线程必须在同步块或方法中执行。)该方法必须在synchronized 代码块和方法 中进行调用。

notify 和wait ,可以进行线程间的通信,也可以用来实现一些 线程池机制。

sleep: sleep 是 当前线程睡一段时间,放弃当前执行权限,cpu会调度其他线程执行,如果超过设定的时间,该线程会自动醒来,从新参与cpu调度。不涉及锁。

yield:  yield跟sleep方法类似,区别是yield不设置时间,只是放弃当前执行权限,立刻从新参与cpu的调度,很可能立刻又从新获取了执行机会。

join:  join是 强行让当前线程等待,执行join进来的线程。直到join进来的线程执行完毕,或者是经执行时间已经超过设置的时间,在继续当前线程的执行。
join 是 利用 wait() 来执行逻辑的。 同步的对象是 thread object.  jvm 会在 thread 的run 运行完后,设置 thread object.inAlive() 为false.
同时 会调用 thread Object.notify(). 这也就是 为什么 ,子线程运行完后, join会自动返回的原因。

interrupt: 该方法 设置 线程的interrupt flag 为true. wait,或 sleep方法会检查该flag. 如果为true.这类方法会抛出 InterruptedException

如何 检查 该flag? Thread.isInterrupted ()返回当前线程的 interrupt flag. 并将该flag 置为 false.
new Thread().isInterrupted() 返回new Thread()的 interrupt flag. 不会重置flag .

方法所在的类
wait(),notify() 在 java.lang.Object
其他在 java.lang.Thread

实例方法(wait(),notify(),join(),interrupt(),isInterrupted)  静态方法(sleep,yield,isInterrupted)




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章