我知道网状使用反应堆模式,以避免为每个连接创建线程, 这个模式的核心理念是“选择”,或在Linux中epoll
系统调用。工作线程Netty中
但我也听说过,如果一个处理器从来没有关闭的通道,这将占用一个工作线程并阻止它:并不意味着每个引黄将使用(块)一个线程,所以每个接受的套接字我们仍然需要创建一个线程?
例如,如果我编写一个具有10,000个持久连接的服务器,该服务器是否需要10,000个工作线程?
上面这两件事之间的矛盾让我困惑,任何人都可以解释我,如果我理解错了吗?谢谢〜
========================================
一个例子(只有一个工作者线程)可以在同一时间处理一个客户端的事件。
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);
}
}
但在我上面的例子中,服务器只能处理一个持久连接。 – Porcelain 2013-02-21 02:05:50
我已经在Win7和Linux(CentOS 5)中使用netty-3.2.4.Final.jar尝试了这个例子。 – Porcelain 2013-02-21 02:06:51
你有更多的工作者比线程。将工厂更改为1个工人,您会看到它可以处理多个连接。 – jdb 2013-02-21 02:30:30