线程机制与事件机制
978 字
5 分钟
线程机制与事件机制
线程
-
进程:程序的一次执行, 它占有一片独有的内存空间
-
线程: CPU的基本调度单位, 是程序执行的一个完整流程
-
进程与线程
- 一个进程中一般至少有一个运行的线程: 主线程
- 一个进程中也可以同时运行多个线程, 我们会说程序是多线程运行的
- 一个进程内的数据可以供其中的多个线程直接共享
- 多个进程之间的数据是不能直接共享的
浏览器内核
-
浏览器内核是指支持浏览器运行的最核心程序 不同浏览器的内核可能不同 Chrome, Safari: webkit firefox: Gecko IE: Trident 360,搜狗等国内浏览器: Trident + webkit
-
内核由很多模块组成
- html,css文档解析模块 : 负责页面文本的解析
- dom/css模块 : 负责dom/css在内存中的相关处理
- 布局和渲染模块 : 负责页面的布局和效果的绘制
- 布局和渲染模块 : 负责页面的布局和效果的绘制
- 定时器模块 : 负责定时器的管理
- 网络请求模块 : 负责服务器请求(常规/Ajax)
- 事件响应模块 : 负责事件的管理
js是单线程的
-
JS 是单线程的语言,所谓“单线程”就是一根筋,对于拿到的程序,一行一行的执行,直到上面的执行为完成,只能做这一件事
-
H5提出了实现多线程的方案:Web workers(很少用)
-
只能在主线程中更新界面,分线程中不能
console.log("1")setTimeout(function(){console.log(2)}, 1000)console.log(3)输出:1 3 2
这个任务是串行的,不能发生阻塞,使用异步解决这种问题
过程:
- 执行第一行,打印1
- 执行setTimeout 后,传入setTimeout 的函数会被暂存起来,不会立即执行(单线程的特点,不能同时干两件事)
- 执行最后一行,打印3
- 待所有程序执行完,处于空闲状态时,会立马看有没有暂存起来的要执行
- 发现暂存起来的 setTimeout 中的函数无需等待时间,立即起来执行
而多个异步代码将会进入回调队列,排队执行
如果主线程中程序执行需要200ms,定时器设置定时100ms,最终在整个程序中定时器会在200ms后执行,而不是300ms。因为在100ms时定时器已经进入回调队列,而主线程程序执行完毕时,回调队列中第一个函数(例子中的定时器)会直接进入执行栈中执行。
事件机制
- 所有代码分类
- 初始化执行代码(同步代码): 包含绑定dom事件监听, 设置定时器, 发送ajax请求的代码
- 回调执行代码(异步代码): 处理回调逻辑
- js引擎执行代码的基本流程:先执行初始化代码,后面在某个时刻才执行回调代码
事件循环模型
- 事件循环模型由两个重要部分组成
- 事件(定时器、DOM事件、Ajax)管理模块
- 回调队列
- 模型运转流程
- 执行初始化代码, 将事件回调函数交给对应模块管理
- 当事件发生时, 管理模块会将回调函数及其数据添加到回调列队中
- 只有当初始化代码执行完后(可能要一定时间), 才会遍历读取回调队列中的回调函数执行

上图中相关重要概念
- 执行栈(execution stack):所有代码都是在此空间执行的
- 浏览器内核(browser core):js引擎模块(在主线程处理),其它模块(在主/分线程处理,如定时器、Ajax、DOM事件监听)
- 回调队列(callback queue)<异步代码在此处等待排队>异步代码在此处等待排队>
- 事件轮询(event loop)<从回调队列中循环取出回调函数放入执行栈中处理>从回调队列中循环取出回调函数放入执行栈中处理>(一个接一个)
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
变量与作用域
javaScript字面量 字面量(常量),都是一些不可改变的值 比如 :1 2 3 4 5 字面量都是可以直接使用,但是我们一般都不会直接使用字面量 变量 变量可以用来保存字面量,而且变量的值是可以任意改变的 变量更加方便我们使用,所以在开发中都是通过变量去保存一个字面量,而很少直接使用字面量,可以通过变量对字面量进…
2
对象
javaScript对象是JS中的引用数据类型 对象是一种复合数据类型,在对象中可以保存多个不同数据类型的属性 使用 typeof 检查一个对象时,会返回 object
3
函数
javaScript函数也是一个对象,也具有普通对象的功能 函数中可以封装一些代码,在需要的时候可以去调用函数来执行这些代码 使用typeof检查一个函数时会返回function
4
字符串方法
javaScript在底层字符串是以字符数组的形式保存的 var str = "abc";// ["a","b","c"] length属性 可以用来获取字符串的长度 console.log(str.length); //输出字符串str的长度
5
正则表达式
javaScript正则表达式用于定义一些字符串的规则,计算机可以根据正则表达式,来检查一个字符串是否符合规则,获取将字符串中符合规则的内容提取出来
随机文章随机推荐














