# 方法簡述
# Thread類
- sleep:暫停當前正在執(zhí)行的線程(類方法)
- yield:暫停當前正在執(zhí)行的線程寿冕,并執(zhí)行其他線程(類方法)
- join:等待該線程終止
- interrupt:中斷該線程,當線程調(diào)用wait()椒袍,sleep()驼唱,join(),或I/O操作時驹暑,將收到InterruptedException或ClosedByInterruptException玫恳;
# Object類
- wait:暫停當前正在執(zhí)行的線程,知道調(diào)用notify()或notifyAll()方法或超時优俘,退出等待狀態(tài)京办;
- notify:喚醒在該對象上等待的一個線程;
- notifyAll:喚醒在該對象上等待的所有線程帆焕;
# 詳細分析
# sleep vs wait
sleep()和wait()方法都是暫停當前正在執(zhí)行的線程惭婿,出讓CPU資源
# wait&¬ify
調(diào)用對象的wait()、notify()叶雹、notifyAll()方法的線程财饥,必須是作為此對象監(jiān)視器的所有者。常見的場景就是synchronized關(guān)鍵字的語句塊內(nèi)部使用者3個方法折晦,如果直接在線程中使用wait()钥星、notify()、notifyAll()方法满着,那么會拋出異常IllegalMonitorException谦炒,拋出的異常表明某一線程已經(jīng)試圖等待對象的監(jiān)視器贯莺,或者試圖通知其他正在等待對象的監(jiān)視器而本身沒有指定監(jiān)視器的線程。
調(diào)用wait()方法的線程编饺,在調(diào)用該線程的interrupt()方法乖篷,則會重新嘗試獲取對象鎖。只有當獲取到對象鎖透且,才開始拋出相應的異常撕蔼,則執(zhí)行該線程之后的程序。
# interrupt
interrupt()方法的工作僅僅是改變中斷狀態(tài)秽誊,并不是直接中斷正在運行的線程鲸沮。中斷的真正原理是當線程被Object.wait()、Thread.join()或Thread.sleep()方法阻塞時锅论,調(diào)用interrupt()方法后改變中斷狀態(tài)讼溺,而wait/join/sleep這些方法內(nèi)部會不斷地檢查線程的中斷狀態(tài)值,當發(fā)現(xiàn)中斷狀態(tài)值時則拋出InterruptException異常最易;對于沒有阻塞的線程怒坯,調(diào)用interrupt()方法時沒有任何作用的。
# yield
yield()方法使當前線程出讓CPU執(zhí)行時間藻懒,當并不會釋放當前線程所持有的鎖剔猿。執(zhí)行完yield()方法后,線程從Running狀態(tài)轉(zhuǎn)變?yōu)镽unable狀態(tài)嬉荆,既然是Runnable狀態(tài)归敬,那么也很可能馬上會被CPU調(diào)度再次進入Running狀態(tài)。