java我应该有一个专用线程来监视超时吗?
现在我有两个线程在我的程序中运行。一个不断尝试从用户那里读取输入,另一个观察超时。如果用户在给定的时间内没有发送任何输入,则会发生超时。这两条线如下所示:
用户输入线程
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语句运行得比需要的时间更长
# 1 楼答案
您需要有两个线程——一个线程等待数据通过InputStream/Reader传入,另一个线程正在观察时间,以确定时间是否过长。使用1个线程的唯一方法是休眠一段超时时间,然后定期轮询数据。但这比使用一个单独的线程专门从InputStream/Reader读取数据效率要低
您可能希望签出Timeout作为实现超时的通用选项
# 2 楼答案
总结一下我的评论:我认为没有必要用单独的线程来检查超时情况
原因:
timeLastRecieved
这样的信息,这可能比你想要的更复杂(例如,在某些情况下,对long
值的访问不是原子的)李>timeLastRecieved
和检查超时是在同一个地方处理的,所以更容易阅读和理解李>关于检查超时的一些提示:
timeLastReceived
时,应该计算超时阈值,然后只检查当前时间,而不是在每次迭代中计算它李>最后,还有一些替代方法,比如使用
java.util.Timer
。在这里,您可以简单地安排一个超时任务,该任务将在超时发生时执行。然后,该任务将检查超时是否真的发生,如果没有,它将返回要在超时发生之前处理新输入,至少可以使用两种方法: