Java多線程中Sleep與Wait的區別


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,或者是有一高優先級的線程處於就緒狀態。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM