为什么每个线程需要在netty中执行Selector.select

时间:2017-01-04 06:23:05

标签: java netty nio

当我阅读 Netty-4.0.0.Final.jar的源代码时,我在NioEventLoop.java中找到了以下令人费解的代码:

protected void run() {
    for (;;) {
        oldWakenUp = wakenUp.getAndSet(false);
        try {
            if (hasTasks()) {
                selectNow();
            } else {
                select();
                if (wakenUp.get()) {
                    selector.wakeup();
                }
            }
            //ignore some code
            processSelectedKeysPlain(selector.selectedKeys());
            //ignore some code
    }
}

在传统的网络程序中,使用一个专用线程来接收就绪事件(接受连接,读取,写入)并使用线程池来提供服务。

我明白了。

netty也遵循这种模式。 使用

ServerBootstrap.group(EventLoopGroup parentGroup, EventLoopGroup childGroup)

不是

ServerBootstrap.group(EventLoopGroup group)

感谢您的回复!

1 个答案:

答案 0 :(得分:0)

  

在传统的网络程序中,使用一个专用线程来接受   连接并使用线程池来提供服务。

这是因为接受连接部分是阻塞它需要在一个线程中完成,以便可以与服务器建立连接,并且必须将连接处理(读取,写入)委托给不同的线程以保持运行。 / p>

  

为什么netty选择混合接受和提供服务的任务   每个线程?

这是因为它使用select(非阻塞I / O)包中的java.nio。 Select自C / C ++以来一直存在,它允许同步I / O多路复用。简而言之,它允许监视多个套接字并检查这些套接字是读,写还是有异常。

由于select的非阻止性质,它可用于检查连接以及在单线程中处理这些连接。