線程中的sleep()、join()、yield()方法有什么區別?


sleep()、join()、yield()有什么區別?

sleep()

sleep() 方法需要指定等待的時間,它可以讓當前正在執行的線程在指定的時間內暫停執行,進入阻塞狀態,該方法既可以讓其他同優先級或者高優先級的線程得到執行的機會,也可以讓低優先級的線程得到執行機會。但是 sleep() 方法不會釋放“鎖標志”,也就是說如果有 synchronized 同步塊,其他線程仍然不能訪問共享數據。

wait()

wait() 方法需要和 notify() 及 notifyAll() 兩個方法一起介紹,這三個方法用於協調多個線程對共享數據的存取,所以必須在 synchronized 語句塊內使用,也就是說,調用 wait(),notify() 和 notifyAll() 的任務在調用這些方法前必須擁有對象的鎖。

注意,它們都是 Object 類的方法,而不是 Thread 類的方法。

wait() 方法與 sleep() 方法的不同之處在於,wait() 方法會釋放對象的“鎖標志”。當調用某一對象的 wait() 方法后,會使當前線程暫停執行,並將當前線程放入對象等待池中,直到調用了 notify() 方法后,將從對象等待池中移出任意一個線程並放入鎖標志等待池中,只有鎖標志等待池中的線程可以獲取鎖標志,它們隨時准備爭奪鎖的擁有權。當調用了某個對象的 notifyAll() 方法,會將對象等待池中的所有線程都移動到該對象的鎖標志等待池。

除了使用 notify() 和 notifyAll() 方法,還可以使用帶毫秒參數的 wait(long timeout) 方法,效果是在延遲 timeout 毫秒后,被暫停的線程將被恢復到鎖標志等待池。

此外,wait(),notify() 及 notifyAll() 只能在 synchronized 語句中使用,但是如果使用的是 ReenTrantLock 實現同步,該如何達到這三個方法的效果呢?解決方法是使用 ReenTrantLock.newCondition() 獲取一個 Condition 類對象,然后 Condition 的 await(),signal() 以及 signalAll() 分別對應上面的三個方法。

yield()

yield() 方法和 sleep() 方法類似,也不會釋放“鎖標志”,區別在於,它沒有參數,即 yield() 方法只是使當前線程重新回到可執行狀態,所以執行 yield() 的線程有可能在進入到可執行狀態后馬上又被執行,另外 yield() 方法只能使同優先級或者高優先級的線程得到執行機會,這也和 sleep() 方法不同。

join()

join() 方法會使當前線程等待調用 join() 方法的線程結束后才能繼續執行


免責聲明!

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



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