效率 - 在循环中使用Thread.yield等待变量更改

时间:2013-04-25 06:10:53

标签: java multithreading asynchronous

我有一些代码如下:

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 个答案:

答案 0 :(得分:1)

不,你几乎不应该使用yield(),绝对不能等待条件变为真。您应该调查一个“真正的”并发控制机制,如Condition(导致线程睡眠,直到被另一个线程唤醒)或CountDownLatch(导致线程睡眠直到某个数字)信号已经发生了。)

答案 1 :(得分:0)

yield()在您看到其他线程停滞的情况下非常有用。换句话说,你有一个非常活跃的线程,它总是优先于其他一些从未真正做过任何事情的线程。从活动线程调用yield()会强制它更改另一个正在运行的线程。

如果你的程序和你的例子一样简单,你可能不需要调用yield,而且取决于timeout()的实现方式(如果它内部有Thread.sleep()Object.wait())也会隐含地导致上下文切换,就像产量一样。

所以,你不需要写它,但你可能已经得到了它的效果。

PS:正如Extreme Coders指出的那样,你可能想要使用等待通知模式,这里是an example

答案 2 :(得分:0)

调用yield()只是操作系统的一个提示,除非等待线程,否则它可能什么都不做。如果你想给CPU一个休息时间,你可以拨打Thread.sleep(10); 10毫秒,或者如你所愿更短。

BTW鉴于您正在等待超时,您可以致电

Thread.sleep(timeUntilTimeoutInMilliSeconds);