我知道 netty 使用 Reactor 模式来避免为每个连接创建一个线程,这种模式的核心概念是epoll
Linux 中的“选择器”或系统调用。
但我也听说如果处理程序从不关闭它的通道,它将占用一个工作线程并阻塞它:这是否意味着每个连接都将使用(阻塞)一个线程,所以对于每个接受的套接字,我们仍然需要创建一个线 ?
例如,如果我编写一个有 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);
}
}