【轉】JAVA sleep()和wait()

感謝原作者:https://blog.csdn.net/qq_34490018/article/details/81609147

目錄

       sleep()方法

       wait()方法

       兩者的區別

       多學一點

 

sleep()方法

       sleep()方法是線程類(Thread)的靜態方法,讓調用的線程進入指定時間睡眠狀態,使得當前線程進入阻塞狀態,告訴系統至少在指定時間內不需要爲線程調度器爲該線程分配執行時間片,給執行機會給其他線程(實際上,調用sleep()方法時並不要求持有任何鎖,即sleep()可在任何地方使用。),但是監控狀態依然保持,到時後會自動恢復。

       當線程處於上鎖時,sleep()方法不會釋放對象鎖,即睡眠時也持有對象鎖。只會讓出CPU執行時間片,並不會釋放同步資源鎖。

       sleep()休眠時間滿後,該線程不一定會立即執行,這是因爲其他線程可能正在運行而起沒有被調度爲放棄執行,除非此線程具有更高的優先級。

       sleep()必須捕獲異常,在sleep的過程中過程中有可能被其他對象調用它的interrupt(),產生InterruptedException異常,如果你的程序不捕獲這個異常,線程就會異常終止,進入TERMINATED狀態,如果你的程序捕獲了這個異常,那麼程序就會繼續執行catch語句塊(可能還有finally語句塊)以及以後的代碼。

       在沒有鎖的情況下,sleep()可以使低優先級的線程得到執行的機會,當然也可以讓同優先級、高優先級的線程有執行的機會。

 

wait()方法

       wait()方法是Object類裏的方法,當一個線程執行wait()方法時,它就進入到一個和該對象相關的等待池中(進入等待隊列,也就是阻塞的一種,叫等待阻塞),同時釋放對象鎖,並讓出CPU資源,待指定時間結束後返還得到對象鎖。

       wait()使用notify()方法、notiftAll()方法或者等待指定時間來喚醒當前等待池中的線程。等待的線程只是被激活,但是必須得再次獲得鎖才能繼續往下執行,也就是說只要鎖沒被釋放,原等待線程因爲爲獲取鎖仍然無法繼續執行。notify的作用只負責喚醒線程,線程被喚醒後有權利重新參與線程的調度。

       wait()方法、notify()方法和notiftAll()方法用於協調多線程對共享數據的存取,所以只能在同步方法或者同步塊中使用,否則拋出IllegalMonitorStateException。

 

兩者的區別

       (1)屬於不同的兩個類,sleep()方法是線程類(Thread)的靜態方法,wait()方法是Object類裏的方法。

       (2)sleep()方法不會釋放鎖,wait()方法釋放對象鎖。

       (3)sleep()方法可以在任何地方使用,wait()方法則只能在同步方法或同步塊中使用。

       (4)sleep()使線程進入阻塞狀態(線程睡眠),wait()方法使線程進入等待隊列(線程掛起),也就是阻塞類別不同。

 

 

多學一點:

join()方法:

       join()方法使調用該方法的線程在此之前執行完畢,也就是等待該方法的線程執行完畢後再往下繼續執行。注意該方法也需要捕捉異常。

yield()方法:

       該方法與sleep()類似,都是可以讓當前正在運行的線程暫停,區別在於yield()方法不會阻塞該線程,它只是將線程轉換成就緒狀態,讓系統的調度器重新調度一次,並且yield()方法只能讓優先級相同或許更高的線程有執行的機會。

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