我正在阅读 Selector 如何多路复用多个通道并在通道准备好处理时执行 I/O 操作。许多在线教程/资源使用类似的东西,它们依次读取每个键,然后对其进行处理。
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> iter = selectedKeys.iterator();
while (iter.hasNext()) {
SelectionKey key = iter.next();
if (key.isReadable()) {
//processKey(key);
}
iter.remove();
}
我在想,当 Key 1 被处理时,所有的键(它代表的套接字)仍然会收到更多传入的数据包
Key 1 : [packet] [packet] [packet] [packet]
.
.
.
Key N : [packet] [packet] [packet] [packet]
那么,如果同时所有的通道都收到了1个数据包,而key 1刚刚处理了1个数据包,那岂不是有些通道丢包了?
Key 1 : [packet] [packet] [packet] [newPacket]
.
.
.
Key N : [packet] [packet] [packet] [packet] [newPacket]
处理键 2
Key 1 : [packet] [packet] [packet] [newPacket] [newPacket]
.
.
.
Key N : [packet] [packet] [packet] [packet] [newPacket] [newPacket]
处理键 3
Key 1 : [packet] [packet] [packet] [newPacket] [newPacket] {packet lost socket receive buffer full}
.
.
.
Key N : [packet] [packet] [packet] [packet] [newPacket] [newPacket] {packet lost socket receive buffer full}
是否应该将每个键传递给一个队列(然后其他线程可以轮询它)以便所有键都可以以多线程方式处理?我可以注册到选择器的“最佳”频道数是多少?