现在,我的程序中正在运行两个线程。一个不断尝试读取用户的输入,而另一个监视超时。如果用户在给定的时间内未发送任何输入,则会发生超时。这两个线程如下所示:
用户输入线程
while(true){
if(in.hasNextLine()){
processLine(in.nextLine());
timeLastRecieved = System.currentTimeMillis();
}
}
超时线程
while(true){
//Check for a timout
if(timeLastRecieved+timeoutDuration <= System.currentTimeMillis())
timeUserOut();
else{
//Sleep until it is possible for a timeout to occur
Thread.sleep((timeLastSent+timeoutDuration) - System.currentTimeMillis());
}
}
到目前为止,我已经将这些线程分开了,但是我可以像这样将它们组合起来...
while(true){
if(in.hasNextLine()){
processLine(in.nextLine());
timeLastRecieved = System.currentTimeMillis();
}
//Check for a timout
if(timeLastRecieved+timeoutDuration <= System.currentTimeMillis())
timeUserOut();
}
但是我真的不需要经常检查超时。因此,我应该合并线程并经常检查超时,还是应该有两个线程。我对性能的担心不如正确的编码礼节。如果有任何意义,则超时时间大约为15分钟。
编辑:只想指出,在两个线程的版本中,我正在睡觉,但是在组合版本中,我从不休眠该线程。显然,这会使检查超时的if语句运行得比必要的多。
总结一下我的评论:我认为不需要单独的线程来检查超时。
原因:
timeLastRecieved
在它们之间共享类似的信息,这可能比所需的信息复杂(例如,在某些情况下AFAIK的访问long
不是原子的)。timeLastRecieved
和检查超时是在同一位置进行的,因此更易于阅读和理解。有关检查超时的一些提示:
timeLastReceived
,然后仅再次检查当前时间,而不是在每次迭代中都进行计算。最后,还有其他替代方法,例如using java.util.Timer
。在这里,您可以简单地安排一个超时任务,该任务应在超时发生时执行。然后,该任务将检查超时是否确实发生了,如果没有发生,则返回超时。
要在超时发生之前处理新的输入,可以使用至少两种方法:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句