而对于渲染进程来说,它当然也是多线程的了,接下来我们来看一下渲染进程包含哪些线程。
•
GUI渲染线程
•
负责渲染页面,布局和绘制
•
页面需要重绘和回流时,该线程就会执行
•
与js引擎线程互斥,防止渲染结果不可预期
•
JS引擎线程
•
负责处理解析和执行javascript脚本程序
•
只有一个JS引擎线程(单线程)
•
与GUI渲染线程互斥,防止渲染结果不可预期
•
事件触发线程
•
用来控制事件循环(鼠标点击、setTimeout、ajax等)
•
当事件满足触发条件时,将事件放入到JS引擎所在的执行队列中
•
定时触发器线程
•
setInterval与setTimeout所在的线程
•
定时任务并不是由JS引擎计时的,是由定时触发线程来计时的
•
计时完毕后,通知事件触发线程
•
异步http请求线程
•
浏览器有一个单独的线程用于处理AJAX请求
•
当请求完成时,若有回调函数,通知事件触发线程
为什么 GUI 渲染线程与 JS 引擎线程互斥
这是由于 JS 是可以操作 DOM 的,如果同时修改元素属性并同时渲染界面(即 JS线程和UI线程同时运行), 那么渲染线程前后获得的元素就可能不一致了。
因此,为了防止渲染出现不可预期的结果,浏览器设定 GUI渲染线程和JS引擎线程为互斥关系, 当JS引擎线程执行时GUI渲染线程会被挂起,GUI更新则会被保存在一个队列中等待JS引擎线程空闲时立即被执行。
评论区