Wait是Object類的方法,范圍是使該Object實例所處的線程。
Sleep()是Thread類專屬的靜態方法,針對一個特定的線程。
Wait方法使實體所處線程暫停執行,從而使對象進入等待狀態,直到被notify方法通知或者wait的等待的時間到。Sleep方法使持有的線程暫停運行,從而使線程進入休眠狀態,直到用interrupt方法來打斷他的休眠或者sleep的休眠的時間到。Wait方法進入等待狀態時會釋放同步鎖(如上例中的lock對象),而Sleep方法不會釋放同步鎖。所以,當一個線程無限Sleep時又沒有任何人去interrupt它的時候,程序就產生大麻煩了notify是用來通知線程,但在notify之前線程是需要獲得lock的。另個意思就是必須寫在synchronized(lockobj) {...}之中。wait也是這個樣子,一個線程需要釋放某個lock,也是在其獲得lock情況下才能夠釋放,所以wait也需要放在synchronized(lockobj) {...}之中。
Sleep與interrupt
interrupt是個很暴力的方法,打斷一個線程的Sleep時并不需要獲得該線程的lock。雖然暴力卻也有暴力的用處。在一個線程無時限sleep的時候也只有interrupt能夠喚醒他。在interrupt的時候會拋出InterruptedException,這個Exception是由Thread 類自動拋出的。因此Interrupt帶有強烈的阻塞味道。
wait與interrupt
interrupt同樣可以打斷wait的等待,與打斷sleep不同的是,被打斷的wait的線程在重新獲得lock之前是不會拋出InterruptedException。
resume和suspend已經被Java遺棄,因為他們天生會引起線程的死鎖。
suspend是個貪婪的家伙,當一個線程在suspend的時候,線程會停下來,但卻仍然持有在這之前獲得的鎖定。其他線程無法使用他鎖定的任何資源,除非這個掛起的線程被resume之后,他才會繼續運行。對于線程的同步,使用wait與notify要安全的多。
新聞熱點
疑難解答