现在我的程序中运行了两个线程。一个人不断尝试读取用户的输入,另一个人观察超时。如果用户在给定的时间内未发送任何输入,则会发生超时。这两个线程看起来像这样:
用户输入线程
TRectangle
超时线程
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());
}
}
但我真的不需要经常检查超时。所以我应该组合线程并经常检查超时,或者我应该有两个线程。我并不担心表现,因为我是正确的编码礼仪。如果它意味着超时持续时间长达15分钟。
编辑:只是想指出在我正在睡觉的两个线程的版本中,但在组合版本中我从不睡觉线程。这显然会导致检查超时的if语句运行得更多。答案 0 :(得分:0)
你需要有两个线程 - 一个等待通过InputStream / Reader进入的数据,另一个正在观察时间是否已经过了太长时间。使用1个线程执行此操作的唯一方法是在一段超时时间内休眠,然后定期轮询数据。但是这比使用专用于从InputStream / Reader读取的单独线程效率低。
您可能需要查看Timeout作为实现超时的通用选项
答案 1 :(得分:0)
总结一下我的评论:我认为不需要单独的线程来检查超时。
原因:
timeLastRecieved
之类的信息,这可能比想要的更复杂(例如,在某些情况下,AFAIK对long
值的访问不是原子的)。timeLastRecieved
更容易阅读和理解,并且在同一位置处理检查超时。 检查超时的一些提示:
timeLastReceived
时计算超时阈值,然后再次检查当前时间,而不是在每次迭代中计算它。最后,还有其他方法,例如使用java.util.Timer
。在这里,您可以简单地安排在超时发生时执行的超时任务。然后,该任务将检查超时是否真的发生,如果不是,则返回。
要在发生超时之前处理新输入,您可以使用至少两种方法: