線程的生命週期:
sleep、wait方法區別:
wait是Object類中的方法,而sleep是Thread類中的方法。
sleep是Thread類中的靜態方法。無論是在a線程中調用b的sleep方法,還是b線程中調用a的sleep方法,誰調用,誰睡覺。
最主要的是sleep方法調用之後,並沒有釋放鎖。使得線程仍然可以同步控制。sleep不會讓出系統資源;調用此方法會讓當前線程暫停執行指定的時間,將執行機會(CPU)讓給其他線程,但是對象的鎖依然保持,因此休眠時間結束後會自動恢復(線程回到就緒狀態)。
而wait是進入線程等待池中等待,釋放鎖,讓出系統資源。
調用wait方法的線程,不會自己喚醒,需要線程調用 notify / notifyAll 方法喚醒等待池中的所有線程,纔會進入就緒隊列中等待系統分配資源。sleep方法會自動喚醒,如果時間不到,想要喚醒,可以使用interrupt方法強行打斷。Thread.sleep(0) // 觸發操作系統立刻重新進行一次CPU競爭。
使用範圍:
sleep可以在任何地方使用。而wait,notify,notifyAll只能在同步控制方法或者同步控制塊中使用;
sleep必須捕獲異常,而wait,notify,notifyAll的不需要捕獲異常。
來自 <https://www.cnblogs.com/ArsenalArsig/p/9149263.html>
sleep、yield方法區別:
1.sleep()方法給其他線程運行機會時不考慮線程的優先級,因此會給低優先級的線程以運行的機會;yield()方法只會給相同優先級或更高優先級的線程以運行的機會;
2. 線程執行sleep()方法後轉入阻塞(blocked)狀態,而執行yield()方法後轉入就緒(ready)狀態;
3.sleep()方法聲明拋出InterruptedException,而yield()方法沒有聲明任何異常;
4. sleep()方法比yield()方法(跟操作系統CPU調度相關)具有更好的可移植性。
來自:https://blog.csdn.net/jackfrued/article/details/44921941