gpt4 book ai didi

java - 我应该有一个专门的线程来观察超时吗?

转载 作者:太空宇宙 更新时间:2023-11-04 12:20:17 26 4
gpt4 key购买 nike

现在我的程序中有两个线程正在运行。一个不断尝试读取用户的输入,另一个则监视超时。如果用户在给定时间内未发送任何输入,则会发生超时。这两个线程如下所示:

用户输入线程

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 分钟。

编辑:只是想指出,在有两个线程的版本中我正在 hibernate ,但在组合版本中我从不 hibernate 线程。这显然会导致检查超时的 if 语句运行得超出必要的范围。

最佳答案

总结我的评论:我认为没有必要使用单独的线程来检查超时。

原因:

  • 您需要在它们之间共享 timeLastRecieved 等信息,这可能比想要的更复杂(例如,据我所知,在某些情况下对 long 值的访问不是原子的)。
  • 从您的描述看来,轮询用户输入和超时(未及时提供输入)密切相关,因此轮询线程也可以检查超时。这并不意味着它也必须处理超时,只是在某个地方报告它或调用一些超时处理程序可能是更好的设计。
  • 由于更新 timeLastRecieved 和检查超时是在同一位置处理的,因此更易于阅读和理解。
  • 由于不需要线程间通信或协调(没有线程需要通信),因此它可能也更加健壮。

检查超时的一些提示:

  • 您应该在更新 timeLastReceived 时计算超时阈值,然后仅再次检查当前时间,而不是在每次迭代中计算它。
  • 您可能需要在处理输入之前计算超时阈值,以免它也依赖于处理时间。

最后,还有其他方法,例如使用java.util.Timer。在这里,您可以简单地安排一个超时任务,该任务在超时发生时执行。然后,该任务将检查超时是否确实发生,如果没有,则返回。

要在超时发生之前处理新输入,您可以使用至少两种方法:

  • 取消当前超时任务,将其从计时器中删除并安排一个新任务。
  • 如果已经有计划的超时任务,则不要计划新任务,而是等待当前任务运行。然后,当前任务检查超时,如果没有发生,它会为当前预期的超时安排一个新任务(或其本身)(请注意,这将需要一些线程间通信,因此请小心)。

关于java - 我应该有一个专门的线程来观察超时吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38919343/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com