我是否应该有专门的线程来观看超时?

用户名

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

用户输入线程

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

对于外部和本地请求,我们是否应该有相同或不同的路由

来自分类Dev

我应该有几个分支?我怎么知道

来自分类Dev

我的游戏中应该有几个View Controller?

来自分类Dev

我的游戏中应该有几个View Controller?

来自分类Dev

我应该有两个不同的模型类来读取和更新Web API中的对象吗?

来自分类Dev

我应该有注册/登录流程来在tvOS App中实施应用内购买吗?

来自分类Dev

应该有指针吗?

来自分类Dev

浮动div应该有高度

来自分类Dev

函数应该有原型错误

来自分类Dev

Azure管道自托管代理-应该有单独的用户来构建和部署吗?

来自分类Dev

原生js defaultValue和jQuery prop(defaultValue)之间是否有区别(应该有)?

来自分类Dev

公共端点和私有端点是否应该有单独的API?

来自分类Dev

Maven模块是否应该有自己的中继文件夹?

来自分类Dev

隐含基类时是否应该有关联?

来自分类Dev

DSE 4 Analytics节点〜它是否应该有数据?

来自分类Dev

使用Spring @Transactional Annotation时是否应该有一个事务类

来自分类Dev

应收帐款和应付帐款-是否应该有已付款帐款?

来自分类Dev

jQuery - 如何知道选择器是否应该有 # 或 . 或类似的东西?

来自分类Dev

android studio 中的生命周期方法是否应该有特定的顺序?

来自分类Dev

为了提高性能,我在MongoDB更新命令中应该有多具体?

来自分类Dev

我的/ usr / local / bin应该有700个权限吗?

来自分类Dev

我应该有两个相同的表吗

来自分类Dev

我整个网站应该有一个大的角度文件吗?

来自分类Dev

什么是/ dev / ram *,我的硬盘上应该有几个?

来自分类Dev

我们的Ubuntu服务器中应该有很多外壳吗?

来自分类Dev

我应该有更多的角度服务或控制器吗?

来自分类Dev

我的问题是代码中应该有哪些变化

来自分类Dev

没有可用的mbr插槽,但应该有

来自分类Dev

我应该有20GB的交换空间,但是我显然根本没有交换空间

Related 相关文章

  1. 1

    对于外部和本地请求,我们是否应该有相同或不同的路由

  2. 2

    我应该有几个分支?我怎么知道

  3. 3

    我的游戏中应该有几个View Controller?

  4. 4

    我的游戏中应该有几个View Controller?

  5. 5

    我应该有两个不同的模型类来读取和更新Web API中的对象吗?

  6. 6

    我应该有注册/登录流程来在tvOS App中实施应用内购买吗?

  7. 7

    应该有指针吗?

  8. 8

    浮动div应该有高度

  9. 9

    函数应该有原型错误

  10. 10

    Azure管道自托管代理-应该有单独的用户来构建和部署吗?

  11. 11

    原生js defaultValue和jQuery prop(defaultValue)之间是否有区别(应该有)?

  12. 12

    公共端点和私有端点是否应该有单独的API?

  13. 13

    Maven模块是否应该有自己的中继文件夹?

  14. 14

    隐含基类时是否应该有关联?

  15. 15

    DSE 4 Analytics节点〜它是否应该有数据?

  16. 16

    使用Spring @Transactional Annotation时是否应该有一个事务类

  17. 17

    应收帐款和应付帐款-是否应该有已付款帐款?

  18. 18

    jQuery - 如何知道选择器是否应该有 # 或 . 或类似的东西?

  19. 19

    android studio 中的生命周期方法是否应该有特定的顺序?

  20. 20

    为了提高性能,我在MongoDB更新命令中应该有多具体?

  21. 21

    我的/ usr / local / bin应该有700个权限吗?

  22. 22

    我应该有两个相同的表吗

  23. 23

    我整个网站应该有一个大的角度文件吗?

  24. 24

    什么是/ dev / ram *,我的硬盘上应该有几个?

  25. 25

    我们的Ubuntu服务器中应该有很多外壳吗?

  26. 26

    我应该有更多的角度服务或控制器吗?

  27. 27

    我的问题是代码中应该有哪些变化

  28. 28

    没有可用的mbr插槽,但应该有

  29. 29

    我应该有20GB的交换空间,但是我显然根本没有交换空间

热门标签

归档