首先,JavaScript是单线程语言
1. 进程和线程的关系
一个程序至少有一个进程,而一个进程至少有一个线程
线程是进程的实体,是CPU调度和分派的基本单位,可以看成实际在干活运算的是线程,而进程只是一个或多个线程的资源分配和调度的系统单位
进程如果是一个工厂,线程则是工厂里干活的工人
工人共享一个劳动空间,共享劳动工具
就是说进程里,有一个或多个线程,各线程共享同个内存空间和数据
可以看看阮一峰的《进程与线程的一个简单解释》
2. 浏览器是多线程
- GUI渲染线程
- JS引擎线程
- 事件触发线程
- 定时触发线程
- 异步http请求线程
其中,GUI线程和JS线程,是互斥!也就是某些页面在做JS运算时,会导致DOM刷新卡住的根源。
所以当JS线程在执行运算时,GUI线程是挂起的
早期通过在代码增加setTimeout
来解决渲染卡顿问题
3. Javascript是单线程
JavaScript可以同时执行多个JS文件代码,看似多线程同时执行,其实还是单线程,只不过是分隔成多个任务,在不同任务跳转进行运算
Javascript的执行机制称为Event Loop
任务又分为同步和异步
同步任务都在主线程上执行,遇到异步任务,则丢到任务队列,接着继续执行同步任务,等到同步任务执行完毕,主线程空闲了,才会回过头去查看任务队列
(图片搜自谷歌)