其实 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的代价,加快了各个连接所在线程的处理速率值。