netty が Reactor パターンを使用して、接続ごとにスレッドを作成することを回避していることは知っています。このパターンに関する中心的な概念は、Linux の「セレクター」またはepoll
システム コールです。
しかし、ハンドラーがチャネルを閉じない場合、1 つのワーカー スレッドを占有してブロックするということも聞きました。それは、各接続が 1 つのスレッドを使用 (ブロック) するという意味ではないので、受け入れられたソケットごとに、まだ作成する必要があります。スレッド ?
たとえば、10,000 の永続的な接続を持つサーバーを作成した場合、このサーバーには 10,000 のワーカー スレッドが必要ですか??
上記の 2 つの矛盾に私は混乱しました。私の理解が間違っていたら、誰か説明してもらえますか? ありがとう〜
========================================
常に 1 つのクライアントのイベントを同時に処理できる例 (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);
}
}