Java选择器select(长)与selectNow的区别
我有一个使用JavaNIO选择器的系统。在某些地方,我在代码中执行以下操作
selector.select(waitTimeOut);
它以某种方式工作
我将上面的行替换为以下内容
long loopTime = 1000;
long start = System.currentTimeMillis();
int selects;
while (((selects = selector.selectNow()) == 0) && ((System.currentTimeMillis() - start) < (waitTimeOut - loopTime))) {
Thread.sleep(loopTime);
}
现在系统的工作方式不同了
waitTimeOut大约是10000
要用不同的方式来解释我的意思是很复杂的。但我希望这两个备选方案在语义上(几乎)相同(除了在代码完成的时间上有一点不同),但我可以看出它们并非如此。有人能解释一下这两者之间的区别吗?这样我就可以开始猜测为什么我的系统会根据我是使用其中一个还是另一个而表现出不同的行为
# 1 楼答案
它们在语义上并不相同。不同之处在于,如果在超时时间内发生事件,您总是至少睡一秒钟,但并不总是选择睡一秒钟
很难理解为什么要用六行不工作的代码替换一行代码