如何设计和实现"超时定时器"在网络编程中,使用java nio

时间:2014-07-02 03:31:16

标签: java networking nio

我正在使用Java NIO来实现服务器。

例如,我将持有超过10K的连接。如果客户端在30秒内没有发送任何数据,服务器将启动此客户端。

如何有效地设计这样的超时定时器?

我的第一个想法是:

  1. 接受来自客户的连接。
  2. 将此连接放入列表,并附上指示上次活动时间的时间戳。
  3. 使用Executors.newFixedSizeSchedulePool每隔30秒安排一名工作人员。
  4. 此工作人员将遍历列表以查找处于非活动状态超过30秒的连接。
  5. 这适用于少量连接。但是,如果连接队列的大小增加怎么办?此解决方案是否仍适用于50K连接或更多连接?

1 个答案:

答案 0 :(得分:1)

最好保留 {time stamp,connection} 对的TreeMap。这样你就可以立即定位到30秒的点(使用ceilingKey())并迭代实际超时的项目,而不是扫描整个列表,因为你打算在这里做。

你也不需要Executor任务,并且当涉及选择器时多线程可能会让你的生活变得非常困难。只需处理select()循环底部的超时连接,或者使用30秒的select()超时,只有当select()返回零时才处理它们。有很多方法可以给这只猫上皮。