在 java 中 wait 和 sleep 方法的不同?


最大的不同是在等待時 wait 會釋放鎖 sleep 一直持有鎖。Wait 通常被用於線 

程間交互,sleep 通常被用於暫停執行

直接了解的深入一點吧

 Java 中線程的狀態一共被分成 6

初始態:NEW

創建一個 Thread 對象但還未調用 start()啟動線程時線程處於初始態

運行態:RUNNABLE

 Java 運行態包括就緒態  運行態

就緒態 該狀態下的線程已經獲得執行所需的所有資源只要 CPU 分配執行權就 

能運行所有就緒態的線程存放在就緒隊列中

運行態 獲得 CPU 執行權正在執行的線程由於一個 CPU 同一時刻只能執行一 

條線程因此每個 CPU 每個時刻只有一條運行態的線程

阻塞態 

當一條正在執行的線程請求某一資源失敗時就會進入阻塞態而在 Java  

塞態專指請求鎖失敗時進入的狀態由一個阻塞隊列存放所有阻塞態的線程 

於阻塞態的線程會不斷請求資源一旦請求成功就會進入就緒隊列等待執行

PS:、IO、Socket 等都資源

等待態 

當前線程中調用 wait、join、park 函數時當前線程就會進入等待態也有一個 

等待隊列存放所有等待態的線程線程處於等待態表示它需要等待其他線程的指 

示才能繼續運行進入等待態的線程會釋放 CPU 執行權並釋放資源

超時等待態 

當運行中的線程調用 sleep(time)、wait、join、parkNanos、parkUntil  

會進入該狀態它和等待態一樣並不是因為請求不到資源而是主動進入 

且進入后需要其他線程喚醒進入該狀態后釋放 CPU 執行權  占有的資源 

等待態的區別到了超時時間后自動進入阻塞隊列開始競爭鎖

終止態 

線程執行結束后的狀態

注意

wait()方法會釋放 CPU 執行權  占有的鎖

sleep(long)方法僅釋放 CPU 使用權鎖仍然占用線程被放入超時等待隊列 

yield 相比它會使線程較長時間得不到運行

yield()方法僅釋放 CPU 執行權鎖仍然占用線程會被放入就緒隊列會在短時 

間內再次執行

wait  notify 必須配套使用即必須使用同一把鎖調用

wait  notify 必須放在一個同步塊中調用 wait  notify 的對象必須是他們所處 

同步塊的鎖對象


免責聲明!

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



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