浏览器的内核是多线程的,它们在内核掌握下相互配合以坚持同步,一个浏览器最少完成三个常驻线程:JavaScript引擎线程
,GUI衬着线程
,浏览器事宜触发线程
。
JavaScript引擎是基于事宜驱动单线程实行的,JavaScript引擎一向守候着使命行列中使命的到来,然后加以处置惩罚,浏览器不管什么时候都只要一个JavaScript线程在运转JavaScript顺序。
GUI衬着线程担任衬着浏览器界面,当界面须要重绘(Repaint)
或因为某种操纵激发回流(Reflow)
时,该线程就会实行。但须要注重,GUI衬着线程与JavaScript引擎是互斥的,当JavaScript引擎实行时GUI线程会被挂起,GUI更新会被保存在一个行列中比及JavaScript引擎空闲时马上被实行。
事宜触发线程,当一个事宜被触发时,该线程会把事宜添加到待处置惩罚行列的队尾,守候JavaScript引擎的处置惩罚。这些事宜可来自JavaScript引擎当前实行的代码块如setTimeout
、也可来自浏览器内核的其他线程如鼠标点击
、Ajax异步要求
等,但因为JavaScript的单线程关联,所有这些事宜都得列队守候JavaScript引擎处置惩罚(当线程中没有实行任何同步代码的前提下才会实行异步代码)。