Java之sleep和wait的區別

來源:互聯網
上載者:User

標籤:

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

   區別一

                 首先需要明白的是這兩個方法根本來自不同的類,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不需捕獲異常。

Java之sleep和wait的區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.