我有一些代码如下:
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可能有更正式的方法来实现这种模式,但是这个解决方案目前工作得很好并且足够清楚,为什么要改变呢?
答案 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);