假设我有一些UDP频道和一些在我的选择器中注册的TCP频道。一旦选择器唤醒,我是否可以保持循环并尽可能多地从所有键(而不仅仅是所选键)读取信息而不循环返回并执行另一个select()?对于TCP来说这没有多大意义,因为我可以通过调用channel.read()尽可能多地读入我的ByteBuffer,但是对于UDP,你只能通过调用channel.receive()一次读取一个数据包。 。那么我读了多少包呢?你是否看到一个问题,只是继续阅读(不只是阅读,而是写作,连接和接受,换句话说所有关键操作),直到没有别的事可做,然后我再次执行选择?这样,UDP通道就不会使其他通道饿死。您可以尽可能多地处理所有通道,从UDP通道一次读取一个数据包。我特别关注:
1)如果我可以在没有它的情况下继续处理我的密钥,那么做太多选择的性能就会受到影响。
2)select()是否做了一些我无法绕过的基本内容,以便继续阅读/写作/接受/连接?
再次,请记住,我将处理所有键,而不仅仅是所选键。如果密钥没有任何关系(没有数据),我什么都不做,继续下一个密钥。
答案 0 :(得分:3)
我认为你必须尝试两种方式。您可以构造一个合理的参数,说明您应该读取每个可读通道,直到read()返回零,或者您应该为每个通道处理一个事件并且每次只执行一次读取。我可能偏爱第一个,但我记得当我没有。
再次,请记住,我将处理所有键而不仅仅是 选择的那些。
为什么呢?您应该在所选通道上处理事件,然后您可能希望对未选择的通道执行超时处理。我不会把这两件事混为一谈,他们是完全不同的。不要忘记从selectedKeys
设置中删除键,无论你采用哪种方式。