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