消息队列和事件循环系统
- 消息队列
- 消息队列是一种数据结构,可以存放要执行的任务。它符合队列先进先出的特点。
- IO线程中的产生的新任务会添加进消息队列尾部。
- 渲染主线程会循环地从消息队列头部中读取任务,执行任务。
- 由于多个线程操作同一个消息队列,所以在添加任务和取出任务时还会加上一个同步锁。
- 渲染进程专门有一个IO线程用来接收其他进程传进来的消息,接收到消息后,会将这些消息组成任务发送渲染主线程。
- 消息队列中的任务类型:输入事件、微任务、文件读写、webSocket、JS定时器、JS执行、解析DOM、样式计算、布局计算、CSS动画。
- 如何处理高优先级的任务
- 观察者模式:设计一套监听接口,当发生变化时,渲染引擎同步调用这些接口。
- DOM发送变化时,采用同步通知的方式会影响当前任务的执行效率;采用异步方式,又会影响到监控的实时性,为此微任务诞生。
- 消息队列中的任务被称为宏任务,每个宏任务都包含一个微任务队列。在执行宏任务的过程中,如果DOM有变化,那么该变化添加到微任务列表中,这样就不会影响到宏任务的执行。
- 如何解决单个任务执行时长过久问题
- 通过回调功能来规避这种问题,也就是让要执行的JS任务滞后执行。
- 事件循环系统
- 循环机制:在线程语句最后添加一个for循环语句,线程会一直循环执行。
- 引入事件:在线程运行过程中,等待事件触发时,线程处于暂停状态,事件发生后,线程会被激活,然后输出事件执行结果。