js的线程机制
来源:互联网 发布:视频剪辑edius软件价格 编辑:程序博客网 时间:2024/05/17 07:21
前几日写了一篇文章,介绍了js阻塞页面加载的问题。当时是通过例子来验证的。今天,我介绍一下浏览器内核,从原理上介绍一下js阻塞页面加载的原因。
浏览器的内核是多线程的,它们在内核制控下相互配合以保持同步,一个浏览器至少实现三个常驻线程:javascript引擎线程,GUI渲染线程,浏览器事件触发线程。
1. javascript引擎是基于事件驱动单线程执行的,JS引擎一直等待着任务队列中任务的到来,然后加以处理,浏览器无论什么时候都只有一个JS线程在运行JS程序。
2. GUI渲染线程负责渲染浏览器界面,当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行。但需要注意 GUI渲染线程与JS引擎是互斥的,当JS引擎执行时GUI线程会被挂起,GUI更新会被保存在一个队列中等到JS引擎空闲时立即被执行。
3. 事件触发线程,当一个事件被触发时该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理。这些事件可来自JavaScript引擎当前执行的代码块如setTimeOut、也可来自浏览器内核的其他线程如鼠标点击、AJAX异步请求等,但由于JS的单线程关系所有这些事件都得排队等待JS引擎处理。
由上文蓝色标注的文字可以知道,当浏览器在执行JS程序的时候,GUI渲染线程会被保存在一个队列中,直到JS程序执行完成。这样就造成了页面的渲染,就是所说的JS阻塞页面加载问题。
很多同学朋友搞不清楚,既然说JavaScript是单线程运行的,那么XMLHttpRequest在连接后是否真的异步?
其实请求确实是异步的,不过这请求是由浏览器新开一个线程请求(参见上图),当请求的状态变更时,如果先前已设置回调,这异步线程就产生状态变更事件放到 JavaScript引擎的处理队列中等待处理,当任务被处理时,JavaScript引擎始终是单线程运行回调函数,具体点即还是单线程运行 onreadystatechange所设置的函数.
- js的线程机制
- js线程机制
- js线程机制
- 线程的同步机制
- 线程的内部机制
- 线程的同步机制
- 线程的同步机制
- Java的线程机制
- Swing的线程机制
- 基本的线程机制
- 线程的消息机制
- js的模块化机制
- pthread线程编程--POSIX的线程机制
- 线程与线程机制的实现
- 线程-002-基本的线程机制
- JS 的间隔线程
- js的单线程
- linux的线程同步机制
- org.springframework.web.filter.CharacterEncodingFilter .
- 解析JSP中标签库
- 团队管理的思考
- Jni编程总结
- 析构理解
- js的线程机制
- PIL安装
- NYOJ-57:6174问题
- 项目中Jar包冲突解决
- 虚拟机中系统扩展硬盘分区大小
- JRebel4.0 在Eclipse中配置使用说明
- C# Windows服务程序安装
- 通过datatable导出数据表到文件
- Java基础/时间戳与Date相互转化