gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:38:46 25 4
gpt4 key购买 nike

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

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

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

最佳答案

yield() 在您看到其他线程停滞的情况下非常有用。换句话说,您有一个非常活跃的线程,它总是比其他从未真正执行任何操作的线程优先。从 Activity 线程调用 yield() 会强制它向另一个正在运行的线程提供更改。

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

所以,您不需要编写它,但无论如何您可能已经得到了它的效果。

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

关于java - 效率 - 在等待变量更改的循环中使用 Thread.yield,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16207602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com