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

相關文章
相關標籤/搜索