通常一个浏览器会至少存在四个线程:JS引擎线程(用于处理JS)、GUI渲染线程(用于页面渲染)、浏览器时间触发线程(用于控制交互),Http请求线程。
而因为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 () { console.log('end 2'); }, 2000);
setTimeout(function () { console.log('end 1'); }, 100);
console.log('end');
执行的结果是输出‘end’‘end 1’,然后浏览器假死,就是不输出‘end 2’。也就是说第一个settimeout里执行的时候是一个死循环,这个直接导致了理论上比它晚一秒执行的第二个settimeout里的函数被阻塞, 这个和我们平时所理解的异步函数多线程互不干扰是不符的。
<script type="text/javascript">
while(true){
console.log("1")
}
</script>
hello world
上面页面显示不出hello world说明JS引擎线程的死循环导致GUI渲染线程的阻塞。
分享到:
相关推荐
JavaScript是一种单线程语言,但是通过异步编程机制如回调函数、Promise和async/await,可以有效地处理非阻塞任务,避免UI冻结,提高应用性能。 #### 模块化编程 随着项目规模的增长,模块化编程变得尤为重要。...
这使得Web应用可以实现更复杂的实时交互和数据处理,比如图像处理、音频分析、大数据计算等。 Web Workers的运行机制是这样的:主线程创建Worker对象并启动,随后通过MessageChannel进行通信。主线程将任务传递给...
JavaScript线程模型和事件驱动 JavaScript是单线程的。为了能实现异步执行,需要明白JavaScript在浏览器中的事件驱动机制。事件驱动一般通过事件循环(event loop)和事件队列(event queue)来实现的。 假定浏览器中有...
JavaScript是单线程的,但通过事件循环和回调函数、Promise、async/await等机制,可以处理复杂的异步任务。例如,XMLHttpRequest和fetch API用于AJAX(异步JavaScript和XML)请求,实现与服务器的数据交换。 函数式...
- **单线程**:JavaScript的核心执行模型是单线程的,这意味着同一时间只能执行一个任务。 #### 如何引入JavaScript JavaScript可以通过多种方式被引入到网页中: 1. **页面嵌入式**:通过`<script type="text/...
- **JavaScript**: Node.js环境中,由于V8引擎的限制,直接设置线程名称并不容易,但可以借助第三方库如`worker_threads`来实现。 线程命名对于多线程编程来说,主要有以下好处: - **可读性**:在日志输出中,带...
尽管如此,Worker 线程对于处理大量计算和大数据操作是非常有用的,比如音频处理、图像分析、WebRTC中的信令等。 在Vue.js这样的前端框架中,虽然主要的视图渲染和状态管理仍然在主线程完成,但可以通过 Worker ...
Node.js作为一款基于Chrome V8引擎的JavaScript运行环境,以其单线程、事件驱动的特性赢得了广大开发者喜爱。然而,随着应用复杂度增加,可能会遇到线程阻塞、CPU占用过高或内存泄漏等问题,这时就需要对线程进行...
4. **异步编程**:JavaScript是单线程的,因此异步编程是其处理耗时操作的关键。书中详细讨论了回调函数、事件循环、Promise和async/await等异步处理方法,帮助开发者理解并有效地管理异步操作。 5. **正则表达式**...
JavaScript是单线程执行的,因此理解和运用异步处理至关重要。这通常涉及事件循环、回调函数、Promise、async/await等技术。学习者将学会如何避免回调地狱,提高代码可读性和可维护性。 模块化是现代JavaScript项目...
"JavaScript Advanced Programming(v3).pdf"这份文档很可能是对上述知识点的详细讲解和实例分析,通过深入阅读和实践,你可以全面掌握JavaScript的高级编程技巧,提升自己的开发能力。记得理论结合实际,多写代码,...
本文实例讲述了JavaScript使用yield模拟多线程的方法。分享给大家供大家参考。具体分析如下: 在python和C#中都有yield方法,通过yield可以实现很多多线程才能实现的功能。 对javascript有版本要求:JavaScript 1.7...
5. **异步编程**:JavaScript是非阻塞的单线程语言,通过事件循环和回调函数处理异步任务。Promise和async/await的引入,使得异步编程更加优雅和易读。 6. **DOM操作**:JavaScript可以直接操作DOM(文档对象模型)...
本项目“Linux下多线程轻量级HTTP服务器”旨在实现一个基本的HTTP服务器,能够响应客户端的HTTP请求,并返回静态文件如HTML、CSS和JavaScript等资源。 首先,我们要理解网络协议的基础。HTTP(超文本传输协议)是...
这些技术用于解决JavaScript的单线程特性导致的问题,使开发者能够编写非阻塞的代码,提高应用程序的响应性。 6. **JavaScript高级特性**:7章节可能包含ES6及更高版本的新特性,如箭头函数、模板字符串、解构赋值...
"Java/JavaScript专家门诊.pdf"可能包含了关于这两门语言的常见问题解答、调试技巧、性能优化建议、最新技术趋势分析等内容。对于Java开发者,可能会讨论JVM优化、Spring框架的应用、并发编程的最佳实践等。对于...
然而,随着技术的发展,开发者们找到了在JS中利用多线程的方法,Concurrent.Thread就是一个这样的库,它允许我们在JavaScript中创建和管理多线程,从而提升性能并解决复杂计算的问题。 **1. Concurrent.Thread概述*...
5. **异步编程**:JavaScript是单线程的,但是通过事件循环和回调函数、Promise、async/await实现了非阻塞的异步操作,这对于处理I/O密集型任务至关重要。 6. **DOM操作**:JavaScript与HTML的交互主要通过Document...