Board logo

标题: Netty源码分析之服务启动(2) [打印本页]

作者: look_w    时间: 2019-1-15 19:19     标题: Netty源码分析之服务启动(2)

MultithreadEventExecutorGroup是核心,管理eventLoop的生命周期,先看看其中几个变量。
1、children:EventExecutor数组,保存eventLoop。
2、chooser:从children中选取一个eventLoop的策略。
构造方法:
[url=][/url]
protected MultithreadEventExecutorGroup(int nThreads, ThreadFactory threadFactory, Object... args) {    if (nThreads <= 0) {        throw new IllegalArgumentException(String.format("nThreads: %d (expected: > 0)", nThreads));    }    if (threadFactory == null) {        threadFactory = newDefaultThreadFactory();    }    children = new SingleThreadEventExecutor[nThreads];    if (isPowerOfTwo(children.length)) {        chooser = new PowerOfTwoEventExecutorChooser();    } else {        chooser = new GenericEventExecutorChooser();    }    for (int i = 0; i < nThreads; i ++) {        boolean success = false;        try {            children = newChild(threadFactory, args);            success = true;        } catch (Exception e) {            // TODO: Think about if this is a good exception type            throw new IllegalStateException("failed to create a child event loop", e);        } finally {            if (!success) {                for (int j = 0; j < i; j ++) {                    children[j].shutdownGracefully();                }                for (int j = 0; j < i; j ++) {                    EventExecutor e = children[j];                    try {                        while (!e.isTerminated()) {                            e.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS);                        }                    } catch (InterruptedException interrupted) {                        Thread.currentThread().interrupt();                        break;                    }                }            }        }    }    final FutureListener<Object> terminationListener = new FutureListener<Object>() {        @Override        public void operationComplete(Future<Object> future) throws Exception {            if (terminatedChildren.incrementAndGet() == children.length) {                terminationFuture.setSuccess(null);            }        }    };    for (EventExecutor e: children) {        e.terminationFuture().addListener(terminationListener);    }} protected EventExecutor newChild(              ThreadFactory threadFactory, Object... args) throws Exception {        return new NioEventLoop(this, threadFactory, (SelectorProvider) args[0]);  }[url=][/url]

1、 根据数组的大小,采用不同策略初始化chooser。
如果大小为2的幂次方,则采用PowerOfTwoEventExecutorChooser;否则使用GenericEventExecutorChooser。
判断一个数是否是2的幂次方的方法,觉得很赞。
private static boolean isPowerOfTwo(int val) {      return (val & -val) == val;}2、newChild方法重载,初始化EventExecutor时,实际执行的是NioEventLoopGroup中的newChild方法,所以,children元素的实际类型为NioEventLoop。
接下去看看NioEventLoop类。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0