标题:
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