1. 程式人生 > >關於sleep()、yield()、wait()三種讓執行緒暫停方法的區別

關於sleep()、yield()、wait()三種讓執行緒暫停方法的區別

一、sleep()是讓當前真正執行的執行緒暫停一段時間,並進入阻塞狀態

噹噹前執行緒呼叫sleep()方法進入阻塞狀態後,在其睡眠狀態內,執行緒不會獲得執行的機會,即使系統沒有其他可執行路徑,處於sleep()中的執行緒也不會執行

二、yield()方法是Thread類提供的一種靜態方法,它可以讓當前正在執行的執行緒暫停,但它不會阻塞該執行緒,他只是讓該執行緒進入了就緒狀態

三、wait() 是object類定義的方法,表示執行緒等待,一直執行了notify()或notifyAll()後才結束等待

四、sleep()和wait()方法的區別

兩種方法都可以讓程式進入阻塞狀態,從執行狀態轉變成阻塞狀態

區別:解除阻塞的時機不一樣

sleep()是自動解除阻塞,喚醒了自動解除阻塞

wait()是不知道阻塞了多長時間,必須另一個執行緒通過notity()喚醒它

區別2:sleep()睡眠的時候沒有釋放鎖,wait()釋放了鎖

五、sleep()方法和yield()方法的區別

1.sleep()方法暫停執行緒後,會給其它執行緒執行機會,不會理會其它執行緒的優先順序;但yield()方法只能給優先順序相同,或者優先順序更高的執行緒執行機會

2.sleep()方法暫停執行緒後,必須經過阻塞時間才會進入就緒狀態;而yield()方法不會將執行緒轉入到阻塞狀態,它直接將執行緒轉到就緒狀態

3.sleep()方法比yield()方法有更好的移植性,通常不建議使用yield()方法控制併發執行緒的執行

4.sleep()方法宣告丟擲了InterruptedExceptions異常,所以呼叫sleep()方法,要麼捕獲該異常,要不宣告丟擲異常