sleep()
方法須要指定等待的時間,它可讓當前正在執行的線程在指定的時間內暫停執行,進入阻塞狀態,該方法既可讓其餘同優先級或者高優先級的線程獲得執行的機會,也可讓低優先級的線程獲得執行機會。可是 sleep()
方法不會釋放「鎖標誌」,也就是說若是有 synchronized
同步塊,其餘線程仍然不能訪問共享數據。spa
wait()
方法須要和 notify()
及 notifyAll()
兩個方法一塊兒介紹,這三個方法用於協調多個線程對共享數據的存取,因此必須在 synchronized
語句塊內使用,也就是說,調用 wait()
,notify()
和 notifyAll()
的任務在調用這些方法前必須擁有對象的鎖。注意,它們都是 Object
類的方法,而不是 Thread
類的方法。線程
wait()
方法與 sleep()
方法的不一樣之處在於,wait()
方法會釋放對象的「鎖標誌」。當調用某一對象的 wait()
方法後,會使當前線程暫停執行,並將當前線程放入對象等待池中,直到調用了 notify()
方法後,將從對象等待池中移出任意一個線程並放入鎖標誌等待池中(隨機喚醒一個線程),只有鎖標誌等待池中的線程能夠獲取鎖標誌,它們隨時準備爭奪鎖的擁有權。當調用了某個對象的 notifyAll()
方法,會將對象等待池中的全部線程都移動到該對象的鎖標誌等待池。code
除了使用 notify()
和 notifyAll()
方法,還可使用帶毫秒參數的 wait(long timeout)
方法,效果是在延遲 timeout 毫秒後,被暫停的線程將被恢復到鎖標誌等待池。對象
wait ( )和wait (long timeout) 方法不一樣之處在於前者不必定會再次參與鎖的競爭,後者會再次參與鎖的競爭,關鍵因素在因而否將線程對象放入鎖標誌等待池中。同步
此外,wait()
,notify()
及 notifyAll()
只能在 synchronized
語句中使用,可是若是使用的是 ReenTrantLock
實現同步,該如何達到這三個方法的效果呢?解決方法是使用 ReenTrantLock.newCondition()
獲取一個 Condition
類對象,而後 Condition
的 await()
,signal()
以及 signalAll()
分別對應上面的三個方法。it
yield()
方法和 sleep()
方法相似,也不會釋放「鎖標誌」,區別在於,它沒有參數,即 yield()
方法只是使當前線程從新回到可執行狀態,因此執行 yield()
的線程有可能在進入到可執行狀態後立刻又被執行,另外 yield()
方法只能使同優先級或者高優先級的線程獲得執行機會,這也和 sleep()
方法不一樣。io
join()
方法會使當前線程等待調用 join()
class