wait和sleep的區別


整體的區別其實是有四個:

1、sleep是線程中的方法,但是wait是Object中的方法。

2、sleep方法不會釋放lock,但是wait會釋放,而且會加入到等待隊列中。

3、sleep方法不依賴於同步器synchronized,但是wait需要依賴synchronized關鍵字。

4、sleep不需要被喚醒(休眠之后推出阻塞),但是wait需要(不指定時間需要被別人中斷)。

下面我們就根據這四個區別來分析。

一、sleep是線程方法,wait是Object方法

這個如何驗證呢?我們還需要到jdk源碼中看看。首先進入到Thread的源碼中看一下,然后俺ctrl+O就可以查看方法列表。在最上面可以搜尋,我們輸入“s”,就可以查看所有以s開頭的方法了。

我們會發現,slee方法真實的在Thread線程類中。下面我們以同樣的方法查看wait。

這是第一個區別很容易驗證,下面我們來看第二個。

二、sleep不釋放lock,wait會釋放

這個如何驗證呢?這就需要代碼了。先看我們的sleep方法

我們看一下運行結果:

在上面的結果中,線程2先獲取了cpu資源,然后開始執行休眠,在休眠過程中線程1是沒法執行的,必須要等待線程2結束之后才可以。這也就是說sleep方法不會釋放鎖,讓其他線程進來。

然后我們測試一下wait方法。

在上面的例子中,我們使用wait方法等待10秒鍾,然后結束。我們看一下結果:

這個過程就驗證了第二條區別,我們接下來看第三個。

三、sleep不依賴同步方法,wait需要

我們還是一次來驗證。首先我們測試sleep方法。

這個方法會依次運行,不會出現任何異常。然后我們主要是看wait方法。

我們運行以下,看一下結果:

OK,下面我們驗證一下第四條區別:

四、sleep不需要被喚醒,wait需要

sleep方法很簡單,我們主要關注wait方法。看代碼:

首先我們定義兩個方法,一個等待方法,一個喚醒方法。

然后再去測試一下:

如果沒有喚醒方法,那第一個線程就會處於一直等待的狀態,第二個線程喚醒了之后就不再等待了。

 

 


免責聲明!

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



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