sleep() 、join()、yield()有什麼區別
sleep()
sleep() 方法需要指定等待的時間,它可以讓當前正在執行的執行緒在指定的時間內暫停執行,進入阻塞狀態,該方法既可以讓其他同優先順序或者高優先順序的執行緒得到執行的機會,也可以讓低優先順序的執行緒得到執行機會。但是 sleep() 方法不會釋放“鎖標誌”,也就是說如果有 synchronized 同步塊,其他執行緒仍然不能訪問共享資料。
wait()
wait() 方法需要和 notify() 及 notifyAll() 兩個方法一起介紹,這三個方法用於協調多個執行緒對共享資料的存取,所以必須在 synchronized 語句塊內使用,也就是說,呼叫 wait()
wait() 方法與 sleep() 方法的不同之處在於, wait() 方法會釋放物件的“鎖標誌”。當呼叫某一物件的 wait() 方法後,會使當前執行緒暫停執行,並將當前執行緒放入物件等待池中,直到呼叫了 notify() 方法後,將從物件等待池中移出任意一個執行緒並放入鎖標誌等待池中,只有鎖標誌等待池中的執行緒可以獲取鎖標誌,它們隨時準備爭奪鎖的擁有權。當呼叫了某個物件的 notifyAll() 方法,會將物件等待池中的所有執行緒都移動到該物件的鎖標誌等待池。
除了使用 notify() 和 notifyAll() 方法,還可以使用帶毫秒引數的 wait(long timeout) 方法,效果是在延遲 timeout 毫秒後,被暫停的執行緒將被恢復到鎖標誌等待池。
此外, wait() , notify() 及 notifyAll() 只能在 synchronized 語句中使用,但是如果使用的是 ReenTrantLock 實現同步,該如何達到這三個方法的效果呢?解決方法是使用 ReenTrantLock.newCondition() 獲取一個 Condition 類物件,然後 Condition 的 wait()
yield()
yield() 方法和 sleep() 方法類似,也不會釋放“鎖標誌”,區別在於,它沒有引數,即 yield() 方法只是使當前執行緒重新回到可執行狀態,所以執行 yield() 的執行緒有可能在進入到可執行狀態後馬上又被執行,另外 yield() 方法只能使同優先順序或者高優先順序的執行緒得到執行機會,這也和 sleep() 方法不同。
join()
join() 方法會使當前執行緒等待呼叫 join() 方法的執行緒結束後才能繼續執行