netty5 NioEventLoopGroup线程池简析

 netty服务端ServerBootstrap 启动的时候,默认有两个eventloop分别是

 bossGroup和 workGroup. (其实大部分人这么叫的.并没有明确这个名字).

一般服务端启动的时候会使用下面的代码

 1         NioEventLoopGroup bossGroup1 = new NioEventLoopGroup(1);//boss
 2         NioEventLoopGroup workerGroup = new NioEventLoopGroup();//worker
 3 
 4         try {
 5             ServerBootstrap b = new ServerBootstrap();
 6             ((ServerBootstrap)((ServerBootstrap)((ServerBootstrap)b.group(bossGroup1, workerGroup).channel(NioServerSocketChannel.class)).option(ChannelOption.SO_BACKLOG, Integer.valueOf(100))).handler(new LoggingHandler(LogLevel.INFO))).childHandler(new ChannelInitializer() {
 7                 public void initChannel(SocketChannel ch) throws Exception {
 8                     ChannelPipeline p = ch.pipeline();
 9                     if(sslCtx != null) {
10                         p.addLast(new ChannelHandler[]{sslCtx.newHandler(ch.alloc())});
11                     }
12 
13                     p.addLast(new ChannelHandler[]{new EchoServerHandler()});
14                 }
15             });
16             ChannelFuture f = b.bind(PORT).sync();
17             f.channel().closeFuture().sync();

 

其中boss用来监控tcp链接,worker用来处理io事件. 具体的说,boss执行 server.accept()操作 .worker处理事件的读写到业务逻辑处理等后续操作.
NioEventLoopGroup 和NioEventLoop 都可以.但是前者使用的是线程池. 其实bossgroup如果服务端开启的是一个端口(大部分都是一个),单线程即可.
worker大部分情况需要多线程处理了 .因为 一个eventloop绑定了一个selector,事件都是通过selector轮询处理的. 一万个情况让一个select处理和让100个selector处理
肯定是多线程效率要高一些(因为有io).
那么下面就讨论一下 ,eventloopgroup的默认线程个数.
请看下面代码
//----开始调用---
NioEventLoopGroup workerGroup = new NioEventLoopGroup();
//默认调用方法
    public NioEventLoopGroup() {
        this(0);
    }
//-----链1
  public NioEventLoopGroup(int nEventLoops, Executor executor) {
        this(nEventLoops, executor, SelectorProvider.provider());
    }
//------连2
 public NioEventLoopGroup(int nEventLoops, Executor executor, SelectorProvider selectorProvider) {
        super(nEventLoops, executor, new Object[]{selectorProvider});
    }
//连3------
 /**
     * @see {@link MultithreadEventExecutorGroup#MultithreadEventExecutorGroup(int, Executor, Object...)}
     */
    protected MultithreadEventLoopGroup(int nEventLoops, Executor executor, Object... args) {
        super(nEventLoops == 0 ? DEFAULT_EVENT_LOOP_THREADS : nEventLoops, executor, args);
    }
//---------连4
 private static final int DEFAULT_EVENT_LOOP_THREADS;

    static {
        DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt(
                "io.netty.eventLoopThreads", Runtime.getRuntime().availableProcessors() * 2));

        if (logger.isDebugEnabled()) {
            logger.debug("-Dio.netty.eventLoopThreads: {}", DEFAULT_EVENT_LOOP_THREADS);
        }
    }

跟踪一下就可以发现 

其实默认线程数是 cpu核心数的2倍. 但是也可以通过

-Dio.netty.eventLoopThreads  参数在服务端启动的时候指定 .

posted @ 2016-01-03 21:15  RedEverything  阅读(6486)  评论(0编辑  收藏  举报