sleep()方法和wait()方法的區別

來源:互聯網
上載者:User

標籤:style   blog   java   color   使用   strong   

1、來源不同:

     sleep()方法來自於 Thread 類的一個靜態方法, 只有繼承了線程類的子類才能調用該方法,且誰調用的誰去睡覺,即使在 A 線程裡調用了 B 的sleep方法,實際上還是 A 去睡覺,要讓 B 線程睡覺要在 B 的代碼中調用sleep。

1 static void sleep(long millis);  //在指定的毫秒數內對當前正在執行的線程進行休眠操作2 static void sleep(long millis,  int nanos);  //在指定的毫秒加納秒內對當前執行線程進行休眠操作

   wait()方法來自於 Object 類,Object類所有Java類的祖先。所以任何一個類都可以調用wait()方法。

1 void wait();  //在其他線程調用此對象的notify()方法或notifyAll()方法前,導致當前線程等待2 void wait(long timeout);  //在其他線程調用此對象的notify()方法或notifyAll()方法,或者超過指定的時間量前,導致該線程等待
3 void wait(long timeout, int nanos); //在其他線程對用此對象的notify()方法或notifyAll()方法,或者其他某個線程終端當前線程,或者已超出某個實際時間量前,當前線程等待

 

2、最主要是sleep()方法沒有釋放鎖,而 wait() 方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。就如同蹲坑,就算在馬桶上睡著了也不讓出這個坑,你睡醒了還可以繼續,這就是sleep();拉到一半被boss換出去,讓出資源,這就是wait(),決定你再次蹲上這個坑的是boss的喚醒。

      所以通常可以描述為 sleep 不出讓系統資源;wait是進入線程等待池等待,出讓系統資源,其他線程可以佔用CPU。一般wait不會加時間限制,因為如果wait線程的運行資源不夠,再出來也沒用,要等待其他線程調用 notify/notifyAll 喚醒等待池中的所有線程,才會進入就緒隊列等待OS分配系統資源。 sleep(milliseconds)可以用時間指定使它自動喚醒過來,如果時間不到只能調用interrupt()強行打斷。

Thread.Sleep(0)的作用是“觸發作業系統立刻重新進行一次CPU競爭”。


3、使用範圍:wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在任何地方使用

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

 


4、sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.