gpt4 book ai didi

java - 工作线程在 Netty 中被阻塞

转载 作者:行者123 更新时间:2023-11-29 03:37:01 31 4
gpt4 key购买 nike

我知道 netty 使用 Reactor 模式避免为每个连接创建一个线程,这种模式的核心概念是 Linux 中的“选择器”或 epoll 系统调用。

但我也听说如果处理程序从不关闭它的 channel ,它将占用一个工作线程并阻塞它:这是否意味着每个连接将使用(阻塞)一个线程,所以对于每个接受的套接字我们还需要创建线程吗?

例如,如果我写一个有 10,000 个持久连接的服务器,这个服务器需要 10,000 个工作线程吗??

上面这两件事的矛盾让我很困惑,如果我理解错了谁能解释一下?谢谢~

========================================

一个始终可以同时处理一个客户端事件的示例(只有 1 个工作线程)。

import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.*;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
public class Netty_test {
public static void main(String[] args) {
ChannelFactory factory =new NioServerSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newFixedThreadPool(1));
ServerBootstrap bootstrap = new ServerBootstrap(factory);
ChannelPipelineFactory cpf=new ChannelPipelineFactory(){
public ChannelPipeline getPipeline() {
return Channels.pipeline(new testHandler());
}
};
bootstrap.setPipelineFactory(cpf);
bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.bind(new InetSocketAddress(100));
}
}
class testHandler extends SimpleChannelHandler {
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
System.out.println("messageReceived, handler work.");
e.getChannel().write(e.getMessage());
ctx.sendUpstream(e);
}
}

最佳答案

不,您的 10,000 个连接将共享工作线程。一个工作线程将处理多个连接/ channel 。这就是为什么不阻塞工作线程非常重要。

关于java - 工作线程在 Netty 中被阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14970807/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com