0

我有一些如下所示的代码:

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

我知道使用锁或异步任务可能有一种更正式的方式来实现这种模式,但是这个解决方案目前运行良好并且足够清晰,那么为什么要改变呢?

4

3 回答 3

1

不,你几乎不应该使用yield(),绝对不应该等待条件变为真。相反,您应该研究“真正的”并发控制机制,例如Condition(导致线程休眠直到被另一个线程唤醒)或CountDownLatch(导致线程休眠直到发生一定数量的信号)。

于 2013-04-25T07:00:36.423 回答
0

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

如果你的程序和你的例子一样简单,你可能不需要调用 yield,加上根据 timeout() 的实现方式(如果它有一个Thread.sleep()Object.wait()内部),它也会像 yield 一样隐式地导致上下文切换。

因此,您不需要编写它,但无论如何您可能已经获得了它的效果。

PS:正如 Extreme Coders 指出的那样,您可能想要使用等待通知模式,这是一个示例

于 2013-04-25T06:28:37.483 回答
0

调用 yield() 只是对操作系统的提示,除非有线程在等待,否则它可能什么也不做。如果你想让 CPU 休息一下,你可以调用Thread.sleep(10);10 毫秒,或者如果你愿意,可以更短。

顺便说一句,鉴于您正在等待超时,您可以致电

Thread.sleep(timeUntilTimeoutInMilliSeconds);
于 2013-04-25T06:34:28.020 回答