【发布时间】:2012-12-22 05:24:09
【问题描述】:
我有这样的代码:
while(isResponseArrived)
Thread.yield();
但我真正想做的是这样的:
long startTime = System.currentTimeInMilliseconds();
while(isResponseArrived)
{
if(isTimeoutReached(startTime))
throw new TimeOutExcepton();
Thread.yield();
}
我还不确定是否抛出异常(这对这个问题并不重要),但我想知道的是如何使其尽可能高效,所以我不会继续处理器。换句话说,我怎样才能使 isTimeoutReached(long startTime) 尽可能提高性能。
我测试过:
for(int x=0; x<99999999; x++)
System.nanoTime();
对比
for(int x=0; x<99999999; x++)
System.currentTimeInMilliseconds();
而且差别很小,在完成时间方面不到 10%
我还考虑使用 Thread.sleep(),但我真的希望在有更新并且处理器正在等待时尽快通知用户。 Thread.yield() 不会让处理器搅动,它只是一个 NOP,给予其他任何处理器优先级,直到它可以继续。
无论如何,在不限制 CPU 的情况下测试超时的最佳方法是什么?这是正确的方法吗?
【问题讨论】:
-
如何设置
isResponseArrived=true?如果它是由网络响应设置的,则最佳方式是读取超时的输入通道。 -
我不能,因为一旦联网通道打开,它就会一直保持打开状态,直到我关闭它。它不像 html 调用那样立即打开和关闭网络,在这种情况下,连接始终是打开的,更像是 ssh 连接。但我想做的是限制任何一个命令可以花费的时间。
标签: java