一种超时控制的方式
  TEZNKK3IfmPf 2023年11月15日 28 0

其实 lz 一直限制在了取系统时间耗时的问题上,所以,一直想变相的通过各种手法排除掉获取系统时间的逻辑,比如使用“次数”来对连接实现超时控制,但其实,使用次数来表示超时控制本身就是个伪命题, 比如,在超时次数的阀值是100,如果在90次后,就一直没有被其他线程使用,一直不到阀值,那怎么去将这个连接释放掉呢?

所以,我想到了另外一种方式解决这个问题:

首先,要明确,我认为取系统时间可以取的,但是不一定要获取连接的这个线程去做这个事情,比如交给其他线程去做,模型可能是这样:     1. 线程A 拿到连接,调用refresh方法

     2.refresh方法中,将连接自己放到一个队列中,后返回。

     3. 某个特殊线程S不停的去队列中拿元素,并且,将拿到的元素和拿到时刻的时间记录下,封装好交给hash环 H, H是一个类似HashMap的HASH环,只不过头尾相接。

     4. Timer线程T不停的去遍历H,将超时时间大于某个阀值的连接拿掉,设置为超时连接。

不过这里需要注意到几个问题:

     1. 考虑到Connection不会无限制增多,设计成环,环并不会无限制增大,所以,可行。

     2. 更仔细点,可以将Connection中放一个标志位,标示是否正在使用,timer扫描时,超时间在使用状态,或者超时间不使用的连接(标准可能不同,在被使用的,可能时间要长一点。)都可以判定为超时连接

     3. 因为连接数有限,所以,线程S的队列中,也不会太长(每个连接一个位子)。

     4. 通过线程S的接入,将去系统时间等耗时操作从连接转移到了线程S中,提高S线程的处理速度。

     5. 线程S或许还可以一次从队列中取出多个元素,统一取一次系统时间,将取出来的多个元素设置为该时间,整个操作在毫秒内完成,可以用一个时间约等于各自连接时的真正时间,降低系统时间的获取频率。

     6……. 欢迎补充。

以一个线程S的代价,加快了各个连接所在线程的处理速率值。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2023年11月15日   36   0   0 多线程同步
  TEZNKK3IfmPf   2023年11月15日   39   0   0 多线程同步
  TEZNKK3IfmPf   2023年11月15日   20   0   0 多线程同步
  TEZNKK3IfmPf   2023年11月15日   22   0   0 多线程同步
TEZNKK3IfmPf