并发处理java.nio.channels.Selector

yur*_*uri 4 java sockets multithreading selector

我正在使用java.nio.channels.Selector,我想为每个准备好读/写/接受的selectedKey创建一个单独的线程,但我想确保相同的套接字永远不会被两个不同的处理线程同时.什么是最好的方法呢?我想在创建线程之前取消每个selectedKey,该线程将处理它的套接字,并在线程完成它的生命后重新注册套接字到选择器,但我不确定这将是多么有效....

Ada*_*ski 9

关于Java中的可扩展I/O 有一个非常好的Doug Lea 演示文稿,我在构建服务器时遵循了这个.我采取以下方法:

我的"reactor"中有一个I/O线程,它只执行I/O(以及非常基本的解码/编码); 它只是在字节和消息对象之间进行转换,然后将传入的消息对象传递给线程池以进行业务逻辑处理.我强烈推荐这种方法 - 除非你的I/O线程变得饱和,否则不需要多个I/O线程,我想大多数I/O瓶颈都是因为它在这个线程上进行的其他处理.

如果您可以证明您的I/O线程已经饱和,您可以按照演示文稿中建议的"多反应堆"模式,主反应堆接受传入的连接,然后将它们交给执行处理的子反应堆.每个子反应器在总连接的子集之间进行多路复用,因此不存在多个线程与给定交互的危险SelectionKey.