Javascript与多线程
来源:互联网 发布:水上电动滑板 淘宝 编辑:程序博客网 时间:2024/05/29 08:35
前几日写了一篇文章,介绍了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所设置的函数.
参考资料:
http://fed.renren.com/2010/01/247
http://www.phpv.net/html/1700.html
来源:http://hi.baidu.com/zhoumm1008/blog/item/51105a49000bd5eed62afc6d.html
- JavaScript 与多线程
- Javascript与多线程
- Javascript与多线程
- Javascript异步编程的4种方法, Javascript与多线程
- javascript多线程
- Javascript 多线程?
- JavaScript多线程
- Javascript多线程问题
- 用javascript模拟多线程
- JavaScript多线程编程简介
- JavaScript多线程编程简介
- 小试JavaScript多线程
- JavaScript多线程编程简介
- JavaScript多线程编程简介
- JavaScript多线程编程简介
- JavaScript多线程编程简介
- JavaScript可否多线程?【转】
- JavaScript多线程编程简介
- Mac myeclipse 2015 svn安装
- 排序算法之——快速排序(Java实现)
- HDU1251-统计难题
- android emulator虚拟设备分析第一篇之battery
- 理解Flux
- Javascript与多线程
- 二级指针学习心得
- storm 并发度
- 应用Druid监控SQL语句的执行情况
- 设计模式(一)工厂模式Factory(创建型)
- CCF 201512-1 数位之和
- C++创建文件夹和为文件夹改名
- android 死机log分析
- test