整體的區別其實是有四個:
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方法。看代碼:
首先我們定義兩個方法,一個等待方法,一個喚醒方法。

然后再去測試一下:

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