sleep()和wait()區別

作者:孫立偉
鏈接:http://www.zhihu.com/question/23328075/answer/24228413

  • 首先,要記住這個差別,“sleep是Thread類的方法,wait是Object類中定義的方法”。儘管這兩個方法都會影響線程的執行行爲,但是本質上是有區別的。

  • Thread.sleep不會導致鎖行爲的改變,如果當前線程是擁有鎖的,那麼Thread.sleep不會讓線程釋放鎖。如果能夠幫助你記憶的話,可以簡單認爲和鎖相關的方法都定義在Object類中,因此調用Thread.sleep是不會影響鎖的相關行爲。

  • Thread.sleep和Object.wait都會暫停當前的線程,對於CPU資源來說,不管是哪種方式暫停的線程,都表示它暫時不再需要CPU的執行時間。OS會將執行時間分配給其它線程。區別是,調用wait後,需要別的線程執行notify/notifyAll才能夠重新獲得CPU執行時間。

  • 線程的狀態參考 Thread.State的定義。新創建的但是沒有執行(還沒有調用start())的線程處於“就緒”,或者說Thread.State.NEW狀態。

  • Thread.State.BLOCKED(阻塞)表示線程正在獲取鎖時,因爲鎖不能獲取到而被迫暫停執行下面的指令,一直等到這個鎖被別的線程釋放。BLOCKED狀態下線程,OS調度機制需要決定下一個能夠獲取鎖的線程是哪個,這種情況下,就是產生鎖的爭用,無論如何這都是很耗時的操作。

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