在处理我的Java应用程序时,我有一个简单的多线程案例(一个异步资源加载器线程和一个主线程等待加载器完成,用进度更新UI),我想通过调用< / p>
while( !foo.isInitialized() ) {
Thread.yield();
}
在主线程中。我知道有更强大的解决方案;仍然,加载器不是由我设计的,它是一个基本上只读的库(我不能简单地wait()
,因为我无法让它发送给我notify()
;而且,它没有'完成后死亡,我只需要等到加载完成。
Java doc说(注意这是1.6文档中的not present并且是由1.7个文档添加的)
使用此方法很少合适。
NetBeans警告我
Google Codepro AnalytiX,OTOH,在
yield()
上调用方法java.lang.Thread
通常用于伪装同步问题,应该避免使用。
不应使用方法
Thread.yield()
,因为它的行为在所有平台上都不一致。
我是否应该关注这些警告并尝试找到更好的解决方案(欢迎所有建议),还是应该将其视为“警告噪音”并禁止/忽略它们?
注意:我想到使用sleep()
的明显可能性(Are Thread.sleep(0) and Thread.yield() statements equivalent?值得一提);但是,如果yield
没有“奖励”而不是经常睡觉,为什么Java会提供它 - 那么它的实际有效用例是什么呢?
略有关联: Is there a better solution to Thread.yield()?&amp; Thread.Sleep or Thread.Yield
答案 0 :(得分:3)
在没有任何等待机制的情况下在while循环中调用Thread.yield()
的主要问题是它很容易变成使用100%其核心的忙等待循环。
如果在产生时没有其他线程要安排,那么产生的线程很可能会很快重新调度,从而导致CPU利用率很高。
除此之外,在这种情况下,我看不出它会比那更有害。但是,这是毫无意义的 - 如果你要编写一个忙等待循环,你可以while (!foo.isInitialized());
,并避免给调度程序带来压力。
如果你没有通知机制,你应该做的是至少在循环中睡觉。这将使你的CPU休息一下。
这种循环的典型实现:
while(!foo.isInitialized()) {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return; // or handle some other way
}
}