2011-01-28 186 views
6

可能重複:
Are Thread.sleep(0) and Thread.yield() statements equivalent?Java中的Thread.yield()和Thread.sleep(0)有什麼區別?

在我的理解,無論是Thread.yield()和的Thread.sleep(0)應使CPU rejudge一些調度算法要運行的線程。

的區別是:

  1. Thread.yield()是給執行機會給其他線程,但是的Thread.sleep(0)不會,它會直接告訴CPU,你應該重新安排執行線程包括當前線程本身。 Thread.yield()只是一個建議,意味着它可能根本不被接受,但Thread.sleep(0)將強制重排。

以上兩個結論是否正確?

+1

由於這些方法非常依賴實現,所以很難說。你不應該依賴這些方法的行爲。例如,如果你有一個循環,只是Thread.yield()它不會放棄CPU 99%+的時間。根據操作系統的不同,Thread.sleep(0)可能會從0.5秒睡眠到2毫秒,放棄CPU,但這也不是保證。 – 2011-01-28 11:32:42

回答

-3

Thread.sleep()將只是暫停線程,而不是放棄控制。 Thread.yield()將暫停該線程並允許其他線程運行。如果沒有線程需要,原始線程將立即恢復。

+3

錯,我想。 Thread.sleep()將使線程脫離運行狀態,並允許調度程序將另一個可運行線程切換爲運行(與Thread.yield()一樣)。然而,線程保持它所擁有的任何鎖。 – 2011-01-28 12:05:38

2

Thread.Sleep()有一個稍大的開銷,因爲它創建了一個包含某種計時器的系統,它將喚醒進程。 (基本上取決於實施)
底線它最後會調用Yield()

Thread.Yield()只需放棄該線程,並在下一輪獲得。

Thread.Sleep(0)可能會有一個優化來調用yield。 (再次執行)