程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> Java線程中sleep和wait的區別詳細介紹

Java線程中sleep和wait的區別詳細介紹

編輯:JAVA編程入門知識
Java中的多線程是一種搶占式的機制,而不是分時機制。搶占式的機制是有多個線程處於可運行狀態,但是只有一個線程在運行。
共同點
1. 他們都是在多線程的環境下,都可以在程序的調用處阻塞指定的毫秒數,並返回。
2. wait()和sleep()都可以通過interrupt()方法 打斷線程的暫停狀態 ,從而使線程立刻拋出InterruptedException。
如果線程A希望立即結束線程B,則可以對線程B對應的Thread實例調用interrupt方法。如果此刻線程B正在wait/sleep/join,則線程B會立刻拋出InterruptedException,在catch() {} 中直接return即可安全地結束線程。
需要注意的是,InterruptedException是線程自己從內部拋出的,並不是interrupt()方法拋出的。對某一線程調用 interrupt()時,如果該線程正在執行普通的代碼,那麼該線程根本就不會拋出InterruptedException。但是,一旦該線程進入到 wait()/sleep()/join()後,就會立刻拋出InterruptedException 。
不同點
1.Thread類的方法:sleep(),yield()等
Object的方法:wait()和notify()等
2.每個對象都有一個鎖來控制同步訪問。Synchronized關鍵字可以和對象的鎖交互,來實現線程的同步。
sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。
3.wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在任何地方使用
4.sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
線程的調度
線程調度器按線程的優先級高低選擇高優先級線程(進入運行中狀態)執行,同時線程調度是搶先式調度,即如果在當前線程執行過程中,一個更高優先級的線程進入可運行狀態,則這個線程立即被調度執行。
搶先式調度又分為:時間片方式和獨占方式。在時間片方式下,當前活動線程執行完當前時間片後,如果有其他處於就緒狀態的相同優先級的線程,系統會將執行權交給其他就緒態的同優先級線程;當前活動線程轉入等待執行隊列,等待下一個時間片的調度。
在獨占方式下,當前活動線程一旦獲得執行權,將一直執行下去,直到執行完畢或由於某種原因主動放棄CPU,或者是有一高優先級的線程處於就緒狀態。
舉例說明
首先我想說的是:在多線程編程中,經常會使用sleep與wait操作,我們理解sleep與wait的最大區別是sleep等待是不會釋放當前鎖,而wait則反之。我今天想到一個現實例子來比較這兩者的區別。
我以去火車站買票的例子來說明。我們去火車站買票,當站到售票窗口前要告訴售票員需要到哪裡的票,什麼時候發車的,售票員就通過電腦去給我們打印票,這個時候我們就得等待。如果我們用sleep模式,就得一直站在那裡等,直到售票員給我們票;如果用wait模式,這個時候就離開我們所站的位置,後面的票友就可能站到我當前的位置(窗口前),我們要取票的話,就得重新排在隊伍後面去取票。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved