2013-04-25 27 views
0

我有一些代码,如下所示:效率 - 循环使用Thread.yield的是等待变量的变化

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这种模式,但这种方法效果很好的时刻,是非常明显的,所以为什么改变?

+3

你可以实现'wait-notify'模式 – 2013-04-25 06:14:10

+0

'timeout()'做什么? – SimonC 2013-04-25 06:14:31

+0

我在这里使用timeout()来表示任何类型的超时条件以确保活跃性。在我的情况下,它检查System.currentTimeMillis()对于在while循环之前进行的测量 – Alex 2013-04-25 07:17:40

回答

0

yield()在您遇到其他线程停滞的情况下非常有用。换句话说,你有一个非常活跃的线程,总是优先于其他线程,而这些线程永远不会做任何事情。从活动线程调用yield()将强制它更改为另一个正在运行的线程。

如果你的程序是为你的例子一样简单,你可能并不需要调用的产量,再加上取决于如何超时()实现(如果它有一个Thread.sleep()Object.wait()内)也将隐含导致上下文切换就像产量一样。

所以,你不需要写它,但你可能已经得到了它的影响。

PS:极端编码人员指出的那样,你可能想使用一个等待通知的模式,这里的an example

+3

如果您重复调用yield(),它将不会做99%的时间。 – 2013-04-25 06:32:22

+0

好吧,我看了一下你链接的例子......我有点困惑于如何在我的情况下使用锁(不是条件)。我没有一个我在这里守护的共享资源,我只想让一个线程在继续之前等待一个条件(由另一个线程引起)发生。我应该在哪里调用lock.lock()? – Alex 2013-05-02 02:18:16

+0

对不起,我实际上是在向Jared Russel的回答中的第一个代码片段指引你。那个不使用锁,但等待/通知 – Miquel 2013-05-02 10:03:49

0

调用产量()仅仅是一个暗示,操作系统,除非有一个线程在等待它很可能无所事事。如果你想让CPU休息一下,你可以拨打Thread.sleep(10); 10毫秒,或者如果你喜欢,可以缩短。

BTW鉴于你在等待超时,你可以打电话

Thread.sleep(timeUntilTimeoutInMilliSeconds); 
+0

我想我并不是真的在担心咀嚼CPU,只是我不希望我的while循环放慢其他线程......所以这听起来像是你说产量适合这个? – Alex 2013-04-25 07:19:59

+0

如果你没有空闲的CPU,这是合适的,如果你有免费的CPU,它不会有任何区别(或伤害) – 2013-04-25 07:31:57

1

不,你应该几乎从来不使用yield()可言的,绝对不是等待条件成为真。你应该看看一个“真正的”并发控制机制,如Condition(这会导致线程休眠直到另一线程被唤醒)或CountDownLatch(这会导致线程休眠直到发生一定数量的信号)。