NIO SelectionKey处理应该是单线程还是多线程?

问题描述 投票:0回答:0

我正在阅读 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}

是否应该将每个键传递给一个队列(然后其他线程可以轮询它)以便所有键都可以以多线程方式处理?我可以注册到选择器的“最佳”频道数是多少?

java udp nio
© www.soinside.com 2019 - 2024. All rights reserved.