Thread.yield()被认为有害吗?

时间:2015-06-23 19:07:04

标签: java multithreading coding-style yield

在处理我的Java应用程序时,我有一个简单的多线程案例(一个异步资源加载器线程和一个主线程等待加载器完成,用进度更新UI),我想通过调用< / p>

while( !foo.isInitialized() ) {
     Thread.yield();
}

在主线程中。我知道有更强大的解决方案;仍然,加载器不是由我设计的,它是一个基本上只读的库(我不能简单地wait(),因为我无法让它发送给我notify();而且,它没有'完成后死亡,我只需要等到加载完成。

Java doc说(注意这是1.6文档中的not present并且是由1.7个文档添加的)

  

使用此方法很少合适。

NetBeans警告我

  

yield()上调用方法java.lang.Thread通常用于伪装同步问题,应该避免使用。

Google Codepro AnalytiX,OTOH,

  

不应使用方法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

1 个答案:

答案 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
    }
}