首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Netty源码分析之服务启动(4)

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。
返回列表