Java选择器select(长)与selectNow-差异

Java选择器select(长)与selectNow-差异,java,select,selector,Java,Select,Selector,我有一个使用JavaNIO选择器的系统。在某些地方,我在代码中执行以下操作 selector.select(waitTimeOut); 它以某种方式工作 我将上面的行替换为以下内容 long loopTime = 1000; long start = System.currentTimeMillis(); int selects; while (((selects = selector.selectNow()) == 0) && ((System.currentTimeMill

我有一个使用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);
}
long loopTime=1000;
长启动=System.currentTimeMillis();
int选择;
而(((selects=selector.selectNow())==0)和((System.currentTimeMillis()-start)<(waitTimeOut-loopTime))){
线程。睡眠(循环时间);
}
现在系统的工作方式不同了

waitTimeOut大约是10000


要用不同的方式来解释我的意思是很复杂的。但我希望这两个备选方案在语义上(几乎)相同(除了在代码完成的时间上有一点不同),但我可以看出它们并非如此。有人能解释一下这两者之间的区别吗?这样我就可以开始猜测为什么我的系统会根据我是使用其中一个还是另一个而表现出不同的行为

它们在语义上不相同。不同之处在于,如果在超时时间内发生事件,您总是睡眠至少一秒钟,但并不总是选择一秒钟


很难理解为什么要用六行不正常的代码来替换一行代码。

有时一秒钟的等待会很难。我不知道我怎么总是睡上一秒钟。如果第一个选择器.selectNow()返回!=0,那么我根本不睡觉。但是这样做我会错过什么吗?如果你进入睡眠状态,你至少会睡上一秒钟。同时,事件可能发生,但您仍处于睡眠状态。select()将在相同的情况下立即返回。这也意味着在睡眠过程中会积累更多的事件,因此当你醒来时,你会有不同大小的准备集要处理,这使得从那时起一切都不一样。我想尝试这种新方法的原因是,在执行selector.select时,我的线程并不总是在waitTimeOut之后继续运行(waitTimeOut)。我在之前和之后都有日志,并且(当我的系统负载很高时,但不是wrt网络流量)这两个日志之间的间隔可以超过100秒,即使waitTimeOut是10秒。这甚至被认为我已经将后面OS-LWP(线程)的优先级提高到了“RT”(chrt-f-p99).Selector文档说了一些关于“没有实时保证”的内容,所以我想尝试这种新方法。坦率地说,我认为你弄错了。你不会改进select()的内核实现,它已经被打死了几十年,所以它几乎不可能有任何bug。但是我迭代了就绪集,所以即使有更多的累积,我想我不会错过任何东西。但这就是我有点怀疑的地方。如果我正确处理就绪集,我会错过任何东西吗?