【问题标题】:Why netty uses only one thread?为什么netty只使用一个线程?
【发布时间】:2014-04-08 12:53:38
【问题描述】:

我正在尝试编写一个 udp 服务器。我以这种方式配置了我的引导程序:

ChannelFactory factory = new NioDatagramChannelFactory(Executors.newCachedThreadPool());

    ConnectionlessBootstrap bootstrap = new ConnectionlessBootstrap(factory);
    bootstrap.setPipelineFactory(new UDPServerPipelineFactory());
    bootstrap.setOption("sendBufferSize", 1048576*2);
    bootstrap.setOption("receiveBufferSize", 1048576*2);
    bootstrap.setOption("tcpNoDelay", true);
    bootstrap.setOption("receiveBufferSizePredictorFactory", new AdaptiveReceiveBufferSizePredictorFactory(1048576, 1048576, 2000000));
    bootstrap.bind(new InetSocketAddress(11000));

这样流水线:

@Override
public ChannelPipeline getPipeline() throws Exception
{
    ChannelPipeline pipeline = Channels.pipeline();

    pipeline.addFirst("execution-handler", new ExecutionHandler(new OrderedMemoryAwareThreadPoolExecutor(16, 2333444, 3444333)));
    pipeline.addLast("decoder", new StringDecoder());
    pipeline.addLast("counter", new UDPHandler());

    return pipeline;
}

但我的 UDPHandler 总是只由一个线程管理。我做错了什么?

【问题讨论】:

  • 可以加jstack输出吗?
  • 感谢您的回复。最后我发现有不止一个线程。我很困惑,因为它们很少改变,对我来说似乎是一个很重要的线程。我的错。

标签: java udp netty


【解决方案1】:

请检查http://lists.jboss.org/pipermail/netty-users/2009-September/001350.html

今天我们遇到了同样的问题,对于UDP,只有一个通道有一个worker。

所以只使用了一个线程。不知道为什么Netty不提供一些特殊的工厂只有一个线程来说明问题。

【讨论】:

    【解决方案2】:

    你没有做错任何事。似乎 Netty UDP 只使用一个线程来处理请求。也有一个issue 对此进行了报道。

    你最好在收到请求后创建一个ExecutorService来执行你的业务逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 2014-03-21
      • 1970-01-01
      相关资源
      最近更新 更多