JS 单线程

js单线程阻塞实例
setTimeout(function () { while (true) { } }, 1000);
setTimeout(function () { alert(‘end 2‘); }, 2000);
setTimeout(function () { alert(‘end 1‘); }, 100);
alert(‘end‘);
结果是弹出’end’、’end 1’,然后浏览器假死,就是不弹出‘end 2’。

js单线程重点:
JS 是单线程的,但是却能执行异步任务,
这主要是因为 JS 中存在事件循环(Event Loop)和任务队列(Task Queue)。

事件循环:
JS 会创建一个类似于 while (true) 的循环,
每执行一次循环体的过程称之为 Tick。
每次 Tick 的过程就是查看是否有待处理事件,
如果有则取出相关事件及回调函数放入执行栈中由主线程执行。
待处理的事件会存储在一个任务队列中,
也就是每次 Tick 会查看任务队列中是否有需要执行的任务。

任务队列:
异步操作会将相关回调添加到任务队列中。
而不同的异步操作添加到任务队列的时机也不同,如 onclick, setTimeout, ajax 处理的方式都不同,
这些异步操作是由浏览器内核的 webcore 来执行的。
onclick 由浏览器内核的 DOM Binding 模块来处理,
当事件触发的时候,回调函数会立即添加到任务队列中。
setTimeout 会由浏览器内核的 timer 模块来进行延时处理,
当时间到达的时候,才会将回调函数添加到任务队列中。
ajax 则会由浏览器内核的 network 模块来处理,
在网络请求完成返回之后,才将回调添加到任务队列中。

主线程:
JS 只有一个线程,称之为主线程。
而事件循环是主线程中执行栈里的代码执行完毕之后,才开始执行的。
所以,主线程中要执行的代码时间过长,会阻塞事件循环的执行,也就会阻塞异步操作的执行。
只有当主线程中执行栈为空的时候(即同步代码执行完后),才会进行事件循环来观察要执行的事件回调,
当事件循环检测到任务队列中有事件就取出相关回调放入执行栈中由主线程执行。

原文地址:https://www.cnblogs.com/justSmile2/p/10764297.html

时间: 2024-11-07 20:23:45

JS 单线程的相关文章

从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理(转)

前言 见解有限,如有描述不当之处,请帮忙及时指出,如有错误,会及时修正. ----超长文+多图预警,需要花费不少时间.---- 如果看完本文后,还对进程线程傻傻分不清,不清楚浏览器多进程.浏览器内核多线程.JS单线程.JS运行机制的区别.那么请回复我,一定是我写的还不够清晰,我来改... ----正文开始---- 最近发现有不少介绍JS单线程运行机制的文章,但是发现很多都仅仅是介绍某一部分的知识,而且各个地方的说法还不统一,容易造成困惑. 因此准备梳理这块知识点,结合已有的认知,基于网上的大量参

浅谈Node.js单线程模型

Node.js采用 事件驱动 和 异步I/O 的方式,实现了一个单线程.高并发的运行时环境,而单线程就意味着同一时间只能做一件事,那么Node.js如何利用单线程来实现高并发和异步I/O?本文将围绕这个问题来探讨Node.js的单线程模型: 1.高并发 一般来说,高并发的解决方案就是多线程模型,服务器为每个客户端请求分配一个线程,使用同步I/O,系统通过线程切换来弥补同步I/O调用的时间开销,比如Apache就是这种策略,由于I/O一般都是耗时操作,因此这种策略很难实现高性能,但非常简单,可以实

js单线程

众所周知,JavaScript是以单线程的方式运行的. 一.为什么js是单线程? 这与它的用途有关.作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM.若以多线程的方式操作这些DOM,则可能出现操作的冲突.假设有两个线程同时操作一个DOM元素,线程1要求浏览器删除DOM,而线程2却要求修改DOM样式,这时浏览器就无法决定采用哪个线程的操作.当然,我们可以为浏览器引入"锁"的机制来解决这些冲突,但这会大大提高复杂性,所以 JavaScript 从诞生开始就选择

关于js单线程(转载)

进程和线程都是操作系统的概念.进程是应用程序的执行实例,每一个进程都是由私有的虚拟地址空间.代码.数据和其它系统资源所组成:进程在运行过程中能够申请创建和使用系统资源(如独立的内存区域等),这些资源也会随着进程的终止而被销毁.而线程则是进程内的一个独立执行单元,在不同的线程之间是可以共享进程资源的,所以在多线程的情况下,需要特别注意对临界资源的访问控制.在系统创建进程之后就开始启动执行进程的主线程,而进程的生命周期和这个主线程的生命周期一致,主线程的退出也就意味着进程的终止和销毁.主线程是由系统

js单线程、js任务队列、异步操作

2017.9.22[面试阶段] 一:js由来 JavaScript 1995年首次设计在浏览器上,领导者为了让他看起来更像java,所以起名JavaScript: js是兼容ECMA标准,也称为ECMAScript:js是一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言: 他的解释器称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早用在HTML上,添加动态功能 二:单线程是js的一大特性 不像其他语言如java一样多线程,不用考虑线程同步的问题: js是用户

【转】浅谈Node.js单线程模型

Node.js采用 事件驱动 和 异步I/O 的方式,实现了一个单线程.高并发的运行时环境,而单线程就意味着同一时间只能做一件事,那么Node.js如何利用单线程来实现高并发和异步I/O?本文将围绕这个问题来探讨Node.js的单线程模型: 1.高并发 一般来说,高并发的解决方案就是多线程模型,服务器为每个客户端请求分配一个线程,使用同步I/O,系统通过线程切换来弥补同步I/O调用的时间开销,比如Apache就是这种策略,由于I/O一般都是耗时操作,因此这种策略很难实现高性能,但非常简单,可以实

js单线程&浏览器多线程

copy大牛的好文:from http://www.cnblogs.com/Mainz/p/3552717.html 只是做个记录,方便以后查看. 面试的时候发现99%的童鞋不理解为什么JavaScript是单线程的却能让AJAX异步发送和回调请求,还有setTimeout也看起来像是多线程的?还有non-blocking IO, event loop等概念很不清楚.来深入分析一下: 首先看下面的代码: 1 2 3 4 5 6 7 8 9 function foo() {     console

js单线程和js异步操作的几种方法

一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事. JavaScript的单线程,与它的用途有关.作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM. 这决定了它只能是单线程,否则会带来很复杂的同步问题.比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准? 单线程就意味着,所有任务需要排队,前一个任务结束,才会执

Ajax_原生ajax写法、理解异步请求、js单线程+事件队列、封装原生ajax

1.原生Ajax 一定要理解Ajax出现的背景 Ajax通过url查询后端接口的数据,在前端做数据的解析和局部更新 1.隐藏帧iframe方式实现页面局部更新---只是为了比较好的用户体验 访问后台接口数据显示在iframe页面中显示,没有做主页面的刷新,但页面实际上也刷新了  看左上角的转圈圈了 2.Ajax异步请求,真正实现页面局部刷新,没有跳转,坐上角小圈圈没转 原生Ajax写法---注意ajax的缩写 3.服务器放回了xml数据格式 解析过程还是很麻烦的,所以这种数据格式很少用了. 4.