简述:
浏览器是多线程的,浏览器至少提供5个线程去辅助一个页面程序的运行,有的浏览器还是多进程的,例如Chrome浏览器(启动时有多个进程,每打开一个页面,就增加了一个进程)
js是单线程的,即js运行在浏览器中,始终在一个线程上执行,js为了提高执行效率,使用异步,异步就是两个或者两个以上的线程共同完成的,(浏览器提供的)
浏览器的6个线程:
1.UI线程(渲染页面,js可以操作DOM,影响渲染,所以js引擎线程和UI线程是互斥的,js执行时会阻塞页面的渲染)
2.js引擎线程(js主线程,执行js代码,用户输入,网络请求)
3.定时器触发线程(setTimeout, setInterval)
4.浏览器事件触发监听线程(控制交互,响应用户)
5.HTTP请求线程(ajax请求的使用)
6.Event Loop轮询处理线程(轮询任务队列)
<script>
for(var i=0;i<10;i++){
setTimeout(function(){
console.log(i);
},0);
}
console.log("这是for循环语句之后的");
</script>
1.点击事件,HTTP请求,setTimeout都将放入任务队列中,等待js主线程任务空了,再执行。
2.js代码由js主线程控制,任务队列由Event Loop线程控制
3.在执行for循环时,每执行一次,就把setTimeout放入任务队列中,(所以执行完for循环,才会执行任务队列中的setTimeout此时i都为10)
4.由Event Loop线程控制的任务队列采用轮询机制。
Event Loop(事件循环)和任务队列:
1.同步函数被调用时,只有前一个任务,执行完毕,才能执行后一个任务。比如fucntion函数(普通函数)
2.异步函数被调用时,先不进入主线程,而进入任务队列,只有任务通知主线程,某个任务可以执行,该任务才能进入主线程执行,比如jQuery中的ajax函数
3.主线程中,同步任务(同步函数)组成执行栈
4.主线程完成执行栈中的同步任务后,就会读取任务队列,放入主线程中执行。
5.只要主线程空了,就会去读取"任务队列"
任务队列 ,也叫事件队列或消息队列
同步和异步通常是用来形容一个函数被调用时发生的行为
主线程中的任务结束之后,取出任务队列的第一个任务,推入执行栈中,重复此步骤这就叫做事件循环
进程与线程:
进程和线程的根本区别是:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。
运行以后的程序叫做“进程”,一个进程一次只能执行一个任务(一般情况下)
如果很多任务需要执行:
1.排队。因为一个进程一次只能执行一个任务,只能等前面的任务执行完,再执行后面的任务
2.新建进程:使用fork命令,为每一个任务新建进程
3.新建进程让线程去完成任务
- 线程自己基本不拥有系统资源,只拥有少量必不可少的资源:程序计数器、一组寄存器、栈。同属一个进程的线程共享进程所拥有的主存空间和资源
- 一个线程只能属于一个进程,但是一个进程可以拥有多个线程。多线程处理就是允许一个进程中在同一时刻执行多个任务。
- 线程具有进程的许多特征,故又称轻型进程,传统进程称重型进程