参考文献
- [1] 什么是 Event Loop?
- [2] 消息循环机制及其原理
- [3] Node.js design pattern : Reactor (Event Loop)
- [4] 基础篇:netty源码 死磕3-传说中神一样的Reactor反应器模式
- [5] 精进篇:netty源码 死磕4-EventLoop的鬼斧神工
Event Loop和Reactor模型的关系
Event Loop就是相当于Reactor模型中Reactor这个角色。
1. RunLoop是什么
RunLoop直译就是跑着的圈。基于RunLoop实现的线程之一直运行的,只不过在某个时间点可能被唤醒执行任务,任务执行完成后又休眠。RunLoop的存在就是保证当前线程一直执行而不退出。
2. RunLoop和线程的关系
- 线程与RunLoop是一一对应的
- 线程如果没有开启RunLoop, 任务执行完就会结束
- 线程销毁了,RunLoop也会在线程结束时停止运行
- 主线程的RunLoop是默认开启的,但是子线程的RunLoop需要手动开启。
总结一下:RunLoop和线程相辅相成,没有线程RunLoop会“死”;但是没有RunLoop,线程无法独“活”。
3. RunLoop结构图
RunLoop是在IOS下的一种模式的名称,该模式在js中叫做EventLoop,在Windows在叫做消息循环。因此RunLoop可以采用如下结构图表示:
上述结构中,主线程是一个Event_Loop结构,其工作线程worker同样也是一个Event_Loop结构。
RunLoop的伪代码如下所示:
int main(int argc char* agrv[]){
do{
Wakeup()
DoSomeThins()
Sleep()
} wihle(!Quit())
}
4. windows下的消息循环
RunLoop这种模式在windows下称为消息循环。windows下的消息循环如下图所示: