sleep()、join()、yield()有什麼區別

sleep()

sleep() 方法須要指定等待的時間,它可讓當前正在執行的線程在指定的時間內暫停執行,進入阻塞狀態,該方法既可讓其餘同優先級或者高優先級的線程獲得執行的機會,也可讓低優先級的線程獲得執行機會。可是 sleep() 方法不會釋放「鎖標誌」,也就是說若是有 synchronized 同步塊,其餘線程仍然不能訪問共享數據。spa

wait()

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 類對象,而後 Conditionawait()signal() 以及 signalAll() 分別對應上面的三個方法。it

yield()

yield() 方法和 sleep() 方法相似,也不會釋放「鎖標誌」,區別在於,它沒有參數,即 yield() 方法只是使當前線程從新回到可執行狀態,因此執行 yield() 的線程有可能在進入到可執行狀態後立刻又被執行,另外 yield() 方法只能使同優先級或者高優先級的線程獲得執行機會,這也和 sleep() 方法不一樣io

join()

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

相關文章
相關標籤/搜索