2013-04-25 26 views
0

我有一些代碼,如下所示:效率 - 循環使用Thread.yield的是等待變量的變化

while (this.conditionIsNotYetMet){ 
    if (timeout()) break; 
    // Don't do anything, just wait till the condition is 
    // filled by a different thread or timeout occurs. 
} 
performSomeCode(); // this code relies on the condition having been met 

代碼工作 - 最終另一個線程充滿狀態,而代碼執行。

我很好奇是否會拋出一個Thread.yield() - 這種方式似乎是正確的,在這個階段,我感覺不到性能差異 - 但我擔心未來它可能會有所作爲,例如在不同的平臺上。

即代碼將成爲

while (this.conditionIsNotYetMet){ 
    if (timeout()) break; 
    Thread.yield(); // <---- CHANGE IS HERE!!!! 
    // Don't do anything, just wait till the condition is 
    // filled by a different thread or timeout occurs. 
} 
performSomeCode(); // this code relies on the condition having been met 

我知道,可能有一個更正式的方式來實現使用鎖或AsynchronousTasks這種模式,但這種方法效果很好的時刻,是非常明顯的,所以爲什麼改變?

+3

你可以實現'wait-notify'模式 – 2013-04-25 06:14:10

+0

'timeout()'做什麼? – SimonC 2013-04-25 06:14:31

+0

我在這裏使用timeout()來表示任何類型的超時條件以確保活躍性。在我的情況下,它檢查System.currentTimeMillis()對於在while循環之前進行的測量 – Alex 2013-04-25 07:17:40

回答

0

yield()在您遇到其他線程停滯的情況下非常有用。換句話說,你有一個非常活躍的線程,總是優先於其他線程,而這些線程永遠不會做任何事情。從活動線程調用yield()將強制它更改爲另一個正在運行的線程。

如果你的程序是爲你的例子一樣簡單,你可能並不需要調用的產量,再加上取決於如何超時()實現(如果它有一個Thread.sleep()Object.wait()內)也將隱含導致上下文切換就像產量一樣。

所以,你不需要寫它,但你可能已經得到了它的影響。

PS:極端編碼人員指出的那樣,你可能想使用一個等待通知的模式,這裏的an example

+3

如果您重複調用yield(),它將不會做99%的時間。 – 2013-04-25 06:32:22

+0

好吧,我看了一下你鏈接的例子......我有點困惑於如何在我的情況下使用鎖(不是條件)。我沒有一個我在這裏守護的共享資源,我只想讓一個線程在繼續之前等待一個條件(由另一個線程引起)發生。我應該在哪裏調用lock.lock()? – Alex 2013-05-02 02:18:16

+0

對不起,我實際上是在向Jared Russel的回答中的第一個代碼片段指引你。那個不使用鎖,但等待/通知 – Miquel 2013-05-02 10:03:49

0

調用產量()僅僅是一個暗示,操作系統,除非有一個線程在等待它很可能無所事事。如果你想讓CPU休息一下,你可以撥打Thread.sleep(10); 10毫秒,或者如果你喜歡,可以縮短。

BTW鑑於你在等待超時,你可以打電話

Thread.sleep(timeUntilTimeoutInMilliSeconds); 
+0

我想我並不是真的在擔心咀嚼CPU,只是我不希望我的while循環放慢其他線程......所以這聽起來像是你說產量適合這個? – Alex 2013-04-25 07:19:59

+0

如果你沒有空閒的CPU,這是合適的,如果你有免費的CPU,它不會有任何區別(或傷害) – 2013-04-25 07:31:57

1

不,你應該幾乎從來不使用yield()可言的,絕對不是等待條件成爲真。你應該看看一個「真正的」併發控制機制,如Condition(這會導致線程休眠直到另一線程被喚醒)或CountDownLatch(這會導致線程休眠直到發生一定數量的信號)。