“嗨,阿米戈!”

“現在我將告訴您一些有關睡眠、屈服和加入方法的信息。”

“真無聊。我剛找到一道面試題:‘ yield ()、sleep ()、wait ()方法有什麼區別?’。你能解釋一下嗎?”

“沒問題,首先,這是三種完全不同的方法。”

1) sleep(timeout)  – 停止當前線程(調用 sleep 的線程)超時參數指示的毫秒數。然後線程進入 TIMED_WAITING 狀態。如果設置了 isInterrupted 標誌,該方法可能會提前結束。

例子 描述
Thread.sleep(500);
當前線程暫停它自己的執行 500 毫秒,或 0.5 秒。

2) yield()  ——當前線程“跳過它的回合”。線程從運行狀態進入就緒狀態,JVM 進入下一個線程。running 和 ready 狀態是RUNNABLE狀態的子狀態。

例子 描述
Thread.yield();
當前線程“跳轉”,Java 立即切換到下一個線程。

3) wait(timeout)  – 這是wait () 方法的一個版本,但有超時。“ wait方法只能在當前線程鎖定的互斥對像上的同步塊內調用。否則,該方法將拋出非法MonitorState異常。

“調用此方法會導致互斥鎖對象的鎖被釋放,使其可供另一個線程獲取。此外,線程進入 WAITING 狀態(對於不帶參數的 wait() 方法)或 TIMED_WAITING 狀態(對於 wait(timeout ) 方法)。”

例子 描述
Object monitor = getMonitor();
synchronized(monitor)
{
 …
 monitor.wait(500);
 …
}
當wait方法被調用時,當前線程釋放monitor對象的鎖,並休眠500毫秒。監視器對象可以被另一個線程獲取。
500 毫秒後,線程將被喚醒,如果監視器不忙,線程將獲取它並繼續工作。
如果監視器被另一個線程鎖定,則當前線程將切換到 BLOCKED 狀態。

4)加入(超時)

“這個方法不在你的問題中,但它在我的課程計劃中,所以我會告訴你它。當你調用 join() 或 join(timeout) 方法時,當前線程被“附加”到線程它調用了這個方法。當前線程進入睡眠狀態並等待它連接到的線程完成(即調用其 join() 方法的線程)。

“當前線程進入 join() 方法的 WAITING 狀態和 join(timeout) 方法的 TIMED_WAITING 狀態。”

例子 描述
Thread thread = getWorkThread();
thread.join(500);
當前線程會加入workerThread線程,等待它結束。
但它將在 500 毫秒後“脫離”並繼續運行。

“wait(timeout) 和 join(timeout) 方法中的超時意味著該方法進入睡眠狀態並等待某事,但不會超過以毫秒為單位的超時時間。然後它會醒來。”

“看起來這些方法唯一的共同點就是超時。它們做的事情完全不同。”

“對,沒錯。”