【问题标题】:How does netty allocate worker thread to new request?netty 如何为新请求分配工作线程?
【发布时间】:2016-04-27 11:29:40
【问题描述】:

在 netty 中,我创建了一个通道工厂,如下所示。

ChannelFactory 工厂 = 新的 NioServerSocketChannelFactory( Executors.newCachedThreadPool(threadFactory), Executors.newCachedThreadPool(threadFactory);

当一个新的请求到来时,boss线程如何从workerthread池中为新的请求分配一个空闲的worker线程?在哪个 netty 类中可以找到这个逻辑?

【问题讨论】:

    标签: java netty nio worker


    【解决方案1】:

    你可以在NioServerBoss.class中找到逻辑。以下为部分netty源码。

       for (;;) {
          SocketChannel acceptedSocket = channel.socket.accept();
          if (acceptedSocket == null) {
              break;
          }
          registerAcceptedChannel(channel, acceptedSocket, thread);
       }
    

    部分 registerAcceptedChannel:

    NioWorker worker = parent.workerPool.nextWorker();
    worker.register(new NioAcceptedSocketChannel(
            parent.getFactory(), pipeline, parent, sink
            , acceptedSocket,
            worker, currentThread), null);
    

    工作线程会检查它的 taskQueue 并运行这个新任务。

    【讨论】:

      【解决方案2】:

      看这里

      老板线程 每个绑定的 ServerSocketChannel 都有自己的 boss 线程。

      boss 线程接受传入连接,直到端口未绑定。 成功接受连接后, boss 线程将接受的 Channel 传递给 NioServerSocketChannelFactory 管理的工作线程之一。

      来自How Netty uses thread pools?

      现在有些事情会有所改善

      netty-issues-240

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-09
        • 2020-10-06
        相关资源
        最近更新 更多