1. 程式人生 > >sleep和wait區別(執行緒基本必問的)

sleep和wait區別(執行緒基本必問的)

     這個問題在面試執行緒方面的知識時,基本上屬於必問的問題。因此這裡有必要做一個較為詳細的總結。

   區別一

                 首先需要明白的是這兩個方法根本來自不同的類,sleep來自Thread,wait來自Object類。

                 sleep是Thread提供的一個靜態方法,該方法出現在那個執行緒中,那個執行緒就"睡覺",並非是

           呼叫該方法的執行緒睡覺,例如a執行緒中呼叫執行緒b.sleep(),a執行緒睡覺。

    區別二

                 最為主要的區別是sleep方法沒有釋放“鎖”,而wait方法釋放了"鎖"不然的話就會形成死鎖了。

                 sleep是不讓出系統資源的;wait是執行緒互動時,如果執行緒a對一個同步物件x發出一個wait

        呼叫該執行緒會進入執行緒等待池等待,需要等其他執行緒呼叫notify/notifyAll喚醒,或者指定的時間過後

        自動喚醒。

                  這裡還需明白一點的就是無論是sleep設定的時間到了,還是wait之後被喚醒了,執行緒並

       不一定立即恢復執行,而是觸發"作業系統重新進行一次CPU競爭"。

    區別三

            使用範圍不一樣(將這作為區別略微牽強了)

             wait、notify/notifyAll必須在同步控制塊、同步方法裡面使用。而sleep的使用在任意地方。

               synchronized(x){
                 x.notify()
                 //或者wait()
                 }

    區別四

             程式碼表現上sleep必須捕獲異常,而wait不需捕獲異常。