1.浏览器的主要线程
UI线程(用于渲染页面)
javascript引擎线程(用于处理js)
GUI事件触发线程(用于交互)
还有HTTP传输线程和定时触发线程(定时器)
(1)UI线程和javascript引擎线程互斥
因为 javascript 可以操作页面的DOM,所以两个线程不互斥的话,ui线程在页面渲染的同时,js进行DOM修改,最终会造成DOM不一致的现象,所以js引擎运行的时候,ui渲染处于冻结状态。
(2)js引擎和GUI事件触发线程(用于交互)异步
浏览器开启事件触发线程,等待用户动作,事件触发线程为响应事件,转移到javascript引擎线程
(3)js引擎和http传输线程 异步
get ,post等请求,xhr异步请求都通过http 传输线程,传送到javascript引擎排队
(4)js引擎和定时触发线程(定时器)异步
settimeout和setinterval,由单独的线程定时触发,传送给javasceipr引擎排队
当然虽然说是这么多主要任务线程,但是实际都是假的,
实际上也是是由一个js线程解决问题。
所以主要的还是任务队列
任务队列是一个事件的队列,IO设备完成一项任务,就在”任务队列“中添加一个事件,表示相关任务可以进入”执行栈“,主任务读取”任务队列“,就是读取里面的哪些事件。