标题:
Netty源码分析之服务启动(4)
[打印本页]
作者:
look_w
时间:
2019-1-15 19:21
标题:
Netty源码分析之服务启动(4)
SingleThreadEventExecutor
从命名上可以看出,这是一个只有一个线程的线程池, 先看看其中的几个变量:
1、state:线程池当前的状态
2、taskQueue:存放任务的队列
3、thread:线程池维护的唯一线程
4、scheduledTaskQueue:定义在其父类AbstractScheduledEventExecutor中,用以保存延迟执行的任务。
...
构造方法:
[url=]
[/url]
protected
SingleThreadEventExecutor(EventExecutorGroup parent, ThreadFactory threadFactory,
boolean
addTaskWakesUp) {
if
(threadFactory ==
null
) {
throw
new
NullPointerException("threadFactory"
); }
this
.parent =
parent;
this
.addTaskWakesUp =
addTaskWakesUp; thread
= threadFactory.newThread(
new
Runnable() { @Override
public
void
run() {
boolean
success =
false
; updateLastExecutionTime();
try
{ SingleThreadEventExecutor.
this
.run(); success
=
true
; }
catch
(Throwable t) { logger.warn(
"Unexpected exception from an event executor: "
, t); }
finally
{
for
(;;) {
int
oldState = STATE_UPDATER.get(SingleThreadEventExecutor.
this
);
if
(oldState >= ST_SHUTTING_DOWN ||
STATE_UPDATER.compareAndSet( SingleThreadEventExecutor.
this
, oldState, ST_SHUTTING_DOWN)) {
break
; } }
//
Check if confirmShutdown() was called at the end of the loop.
if
(success && gracefulShutdownStartTime == 0
) { logger.error(
"Buggy " + EventExecutor.
class
.getSimpleName() + " implementation; " +
SingleThreadEventExecutor.
class
.getSimpleName() + ".confirmShutdown() must be called " + "before run() implementation terminates."
); }
try
{
//
Run all remaining tasks and shutdown hooks.
for
(;;) {
if
(confirmShutdown()) {
break
; } } }
finally
{
try
{ cleanup(); }
finally
{ STATE_UPDATER.set(SingleThreadEventExecutor.
this
, ST_TERMINATED); threadLock.release();
if
(!
taskQueue.isEmpty()) { logger.warn(
"An event executor terminated with " + "non-empty task queue (" + taskQueue.size() + ')'
); } terminationFuture.setSuccess(
null
); } } } } }); threadProperties
=
new
DefaultThreadProperties(thread); taskQueue
=
newTaskQueue();}
[url=]
[/url]
代码很长,内容很简单:
1、初始化一个线程,并在线程内部执行NioEventLoop类的run方法,当然这个线程不会立刻执行。
2、使用LinkedBlockingQueue类初始化taskQueue。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0