#消息队列和事件循环

#单线程

一个线程中去执行任务

#在线程运行过程中处理新任务

要想在线程运行过程中,能接收并执行新的任务,就需要采用事件(任务)循环机制 不停的循环接受事件(任务),接受后处理事件(任务)

#处理其他线程发送过来的任务

渲染主线程会频繁接收到来自于 IO 线程的一些任务,比如鼠标点击,资源加载完成等

使用消息队列存放要执行的任务,IO 线程中产生的新任务添加进消息队列尾部

事件循环从队列头部取出任务

#处理其他进程发送过来的任务

渲染进程专门有一个 IO 线程用来接收其他进程传进来的消息

#消息队列中的任务类型

输入事件(鼠标滚动、点击、移动)、微任务、文件读写、WebSocket、JavaScript 定时器等等。 JavaScript 执行、解析 DOM、样式计算、布局计算、CSS 动画等。

#页面使用单线程的缺点

第一个问题是如何处理高优先级的任务。

通常我们把消息队列中的任务称为宏任务,每个宏任务中都包含了一个微任务队列

执行宏任务的过程中,如果 DOM 有变化,那么就会将该变化添加到微任务列表中,宏任务中的主要功能都直接完成之后,执行当前宏任务中的微任务

微任务常用的就是 promise

#总结

  • 如果有一些确定好的任务,可以使用一个单线程来按照顺序处理这些任务,这是第一版线程模型。
  • 要在线程执行过程中接收并处理新的任务,就需要引入循环语句和事件系统,这是第二版线程模型。
  • 如果要接收其他线程发送过来的任务,就需要引入消息队列,这是第三版线程模型。
  • 如果其他进程想要发送任务给页面主线程,那么先通过 IPC 把任务发送给渲染进程的 IO 线程,IO 线程再把任务发送给页面主线程。
  • 消息队列机制并不是太灵活,为了适应效率和实时性,引入了微任务。