一: 什么是进程?
我们可以在电脑的任务管理器中查看到正在运行的程序,就是一个进程,可以理解为一个程序就是一个进程,比如浏览器打开了一个网页就是一个进程,打开了三个网页就是三个进程,一个进程是包含多个线程的,这些线程相互配合,组成网页。
二:线程有哪些?
线程如下:
- GUI渲染线程
- js引擎线程
- EventLoop处理线程
- 其他线程 比如:
1. 定时器线程(setTimeout)
2. http异步线程(ajax)
3. 浏览器事件线程 等等
注意:js语言设定js引擎线程与GUI引擎线程是互斥的,也就是说GUI引擎在渲染时会阻塞js引擎计算。
三:js引擎线程
JS 引擎线程,我们把它称为 主线程 ,它是干嘛的?用来运行JS代码的(但是不包括异步代码),比如:
1 var a = 2;
2 console.log();
3 setTimeout();
4 ajax();
第1、4行代码是同步代码,直接在主线程中运行;第2、3行代码交给其他线程运行。
看下图:
任务队列可以理解为一个静态的队列存储结构,非线程,只做存储,里面存的是一堆异步成功后的回调函数。
四: 其他线程间的不同
主线程把setTimeout、ajax、dom.onclick分别给了其他三个线程,他们之间有些不同
1、对于setTimeout代码,定时器触发线程在接收到代码时就开始计时,时间到了才将回调函数扔进队列。
2、对于ajax代码,http 异步线程立即发起http请求,请求成功后将回调函数扔进队列。
3、对于dom.onclick,浏览器事件线程会先监听dom,直到dom被点击了,才将回调函数扔进队列。