欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浏览器UI线程和js线程实例介绍

程序员文章站 2024-01-29 19:44:28
通常一个会至少存在三个线程:js引擎线程(用于处理js)、gui渲染线程(用于页面渲染)、浏览器时间触发线程(用于控制交互)。 而因为js可以操作dom元素,进而会影响到gui的...

通常一个会至少存在三个线程:js引擎线程(用于处理js)、gui渲染线程(用于页面渲染)、浏览器时间触发线程(用于控制交互)。

而因为js可以操作dom元素,进而会影响到gui的渲染结果,因此js引擎线程与gui渲染线程是互斥的。也就是说当js引擎线程处于运行状态时,gui渲染线程将处于冻结状态。

js引擎是基于事件驱动,采用的是单线程运行机制。即js引擎会只会顺序的从任务列表中取任务,并执行。

settimeout/setinternal

其中settiemout:在指定的毫秒数后调用指定的代码段;setinternal:在指定的时间间隔内(ms)循环调用指定的代码段。这两个函数内都涉及到时间计数器,也就是都涉及到一个类似与mfc定时器。js引擎本身就只能单线程运行,因此定时器需要由其他的外部线程来启动。所以对js引擎而言,定时器线程可以被视为异步线程。但当定时器时间到达后,所触发的事件则必须在任务列表中排队,等候js引擎的处理。

关于settimeout下面有一个例子,可以帮助深入理解:

        settimeout(function () { while (true) { } }, 1000);
        settimeout(function () { alert('end 2'); }, 2000);
        settimeout(function () { alert('end 1'); }, 100);
        alert('end');

执行的结果是弹出‘end’‘end 1’,然后浏览器假死,就是不弹出‘end 2’。也就是说第一个settimeout里执行的时候是一个死循环,这个直接导致了理论上比它晚一秒执行的第二个settimeout里的函数被阻塞,这个和我们平时所理解的异步函数多线程互不干扰是不符的。

浏览器UI线程和js线程实例介绍

(1)ui线程

(2)js线程

(3)事件(触发)线程