对于Event Loop的一些理解
2016-10-08 19:17
281 查看
js语言的一大特点就是单线程,即统一时间只能做一件事情。
任务可分为两种,一种是同步任务,另一种是异步任务
(1)同步任务是指在主线程上排列的任务,只有执行完毕才能够执行下一个任务
(2)异步任务不进入主线程,而是进入任务队列,只有“任务队列”通知主线程某个异步任务可以执行了,该任务会进入主线程执行。
所以同步任务也被视为没有异步任务的异步执行。
javascript运行机制(只要主线程空了,就会读取“任务队列”,依次执行事件所对应的回调函数):
(1)所有同步任务都在主线程上执行,形成一个“执行栈”
(2)主线程外,还存在一个“任务队列”,只要异步任务有了运行结果,就在“任务队列”中放置一个事件。
(3)一旦“执行栈”中所有同步任务执行完毕,系统就会读取“任务队列”看看还有哪些事件,那些对应的异步任务结束等待状态,进入执行栈开始执行(所以执行栈中的代码即同步任务总是在读取“任务队列”即异步任务之前执行)。
(4)主线程不断重复上面3步。
“任务队列”是一个事件的队列(IO设备完成一项任务,就在任务队列中添加一个事件,表示相关的异步任务可以进入“执行栈”了,主线程读取“任务队列”就是读取里面有哪些事件;用户产生的事件,比如点击页面,滚动页面等操作,只要指定过回调函数,这些事件发生时就会进入“任务队列”,等待主线程读取。)
“任务队列”是先进先出的,排在前面的事件优先被主线程读取,主线程读取过程是自动的,循环不断的,所以这个过程也称为事件循环。
任务可分为两种,一种是同步任务,另一种是异步任务
(1)同步任务是指在主线程上排列的任务,只有执行完毕才能够执行下一个任务
(2)异步任务不进入主线程,而是进入任务队列,只有“任务队列”通知主线程某个异步任务可以执行了,该任务会进入主线程执行。
所以同步任务也被视为没有异步任务的异步执行。
javascript运行机制(只要主线程空了,就会读取“任务队列”,依次执行事件所对应的回调函数):
(1)所有同步任务都在主线程上执行,形成一个“执行栈”
(2)主线程外,还存在一个“任务队列”,只要异步任务有了运行结果,就在“任务队列”中放置一个事件。
(3)一旦“执行栈”中所有同步任务执行完毕,系统就会读取“任务队列”看看还有哪些事件,那些对应的异步任务结束等待状态,进入执行栈开始执行(所以执行栈中的代码即同步任务总是在读取“任务队列”即异步任务之前执行)。
(4)主线程不断重复上面3步。
“任务队列”是一个事件的队列(IO设备完成一项任务,就在任务队列中添加一个事件,表示相关的异步任务可以进入“执行栈”了,主线程读取“任务队列”就是读取里面有哪些事件;用户产生的事件,比如点击页面,滚动页面等操作,只要指定过回调函数,这些事件发生时就会进入“任务队列”,等待主线程读取。)
“任务队列”是先进先出的,排在前面的事件优先被主线程读取,主线程读取过程是自动的,循环不断的,所以这个过程也称为事件循环。
相关文章推荐
- 对于线程的一些理解
- 本人对于“用例”的一些理解和总结
- 对于 “OWASP TOP 10” 的一些理解
- 对于产品中“赞”的一些理解
- sql和mysql对于别名不能调用的一些理解
- 对于MVC应该理解的一些问题
- 关于sql和mysql对于别名不能调用的一些理解
- 对于json多维解析的一些理解
- 转 本人对于“用例”的一些理解和总结
- printf("%d,%d",b++,++b); 对于printf的一些理解,以及前++后++
- 转 本人对于“用例”的一些理解和总结
- 对于I2C总线协议的一些理解,未完待续。。。
- 对于Android中消息机制的一些理解
- 对于Android中消息机制的一些理解
- 对于linux文件结构的一些理解与总结
- 对于android触摸事件模型的一些理解
- 对于NHibernate中延迟加载个人的一些理解
- 本人对于“用例”的一些理解和总结
- OpenCV中对于cvCreateImage和cvReleaseImage的一些小理解
- 对于Oracle Undo Redo的一些理解心得,希望有用