sleep() 和 wait() 有什么區別?


sleep() 和 wait() 有什么區別?

sleep()和wait()都是線程暫停執行的方法。

1、這兩個方法來自不同的類分別是Thread和Object,sleep方法屬於Thread類中的靜態方法,wait屬於Object的成員方法。
2、sleep()是線程類(Thread)的方法,不涉及線程通信,調用時會暫停此線程指定的時間,但監控依然保持,不會釋放對象鎖,到時間自動恢復wait()是Object的方法,用於線程間的通信,調用時會放棄對象鎖,進入等待隊列,待調用notify()/notifyAll()喚醒指定的線程或者所有線程,才進入對象鎖定池准備獲得對象鎖進入運行狀態。
3、wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用(使用范圍)。
4、sleep()方法必須捕獲異常InterruptedException,而wait()\notify()以及notifyAll()不需要捕獲異常。

 

注意:

  sleep方法只讓出了CPU,而並不會釋放同步資源鎖。

  線程執行sleep()方法后會轉入阻塞狀態。

  sleep()方法指定的時間為線程不會運行的最短時間。因此,sleep()方法不能保證該線程睡眠到期后就開始執行。

  notify的作用相當於叫醒睡着的人,而並不會給他分配任務,就是說notify只是讓之前調用wait的線程有權利重新參與線程的調度。

解釋說明:

  sleep:Thread類中定義的方法,表示線程休眠,會自動喚醒;
  wait:Object中定義的方法,需要手工調用notify()或者notifyAll()方法。
  sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時后會自動恢復。調用sleep不會釋放對象鎖。 wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)后本線程才進入對象鎖定池准備獲得對象鎖進入運行狀態。
  sleep就是正在執行的線程主動讓出cpu,cpu去執行其他線程,在sleep指定的時間過后,cpu才會回到這個線程上繼續往下執行,如果當前線程進入了同步鎖,sleep方法並不會釋放鎖,即使當前線程使用sleep方法讓出了cpu,但其他被同步鎖擋住了的線程也無法得到執行。wait是指在一個已經進入了同步鎖的線程內,讓自己暫時讓出同步鎖,以便其他正在等待此鎖的線程可以得到同步鎖並運行,只有其他線程調用了notify方法(notify並不釋放鎖,只是告訴調用過wait方法的線程可以去參與獲得鎖的競爭了,但不是馬上得到鎖,因為鎖還在別人手里,別人還沒釋放。如果notify方法后面的代碼還有很多,需要這些代碼執行完后才會釋放鎖,可以在notfiy方法后增加一個等待和一些代碼,看看效果),調用wait方法的線程就會解除wait狀態和程序可以再次得到鎖后繼續向下運行。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM