我正在使用Java NIO来实现服务器。
例如,我将持有超过10K的连接。如果客户端在30秒内没有发送任何数据,服务器将启动此客户端。
如何有效地设计这样的超时定时器?
我的第一个想法是:
这适用于少量连接。但是,如果连接队列的大小增加怎么办?此解决方案是否仍适用于50K连接或更多连接?
答案 0 :(得分:1)
最好保留 {time stamp,connection} 对的TreeMap。这样你就可以立即定位到30秒的点(使用ceilingKey())并迭代实际超时的项目,而不是扫描整个列表,因为你打算在这里做。
你也不需要Executor任务,并且当涉及选择器时多线程可能会让你的生活变得非常困难。只需处理select()循环底部的超时连接,或者使用30秒的select()超时,只有当select()返回零时才处理它们。有很多方法可以给这只猫上皮。