JavaScript单线程和任务队列是什么

本文章是对以往“JavaScript单线程任务队列什么”知识点的总结与梳理,不仅内容丰富、详细,而且知识点逻辑十分清晰。相信多数人读完本文后,会对“JavaScript单线程和任务队列是什么”的知识内容,有更为深入的理解和认识。

一、JavaScript为什么设计为单线程?

JavaScript语言的一大特点就是单线程,换言之就是同一个时间只能做一件事。

for(var j = 0; j < 5; j++) { console.log(j);}console.log('end');

上面的代码,只有for循环执行完毕,才会执行end;

JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途就是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。

假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?

所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。

为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。

二、任务队列

“任务队列”是一个事件的队列(也可以理解成消息的队列),IO设备完成一项任务,就在”任务队列”中添加一个事件,表示相关的异步任务可以进入”执行栈”了。主线程读取”任务队列”,就是读取里面有哪些事件;

我们来解释一下:

Javascript是单线程的,单线程就意味着所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。

如果排队是因为计算量太大,CPU占用高倒也情有可原,但是很多时候CPU是处于空闲状态或者有很大的空间未被使用,因为IO设备(输入输出设备)很慢(比如Ajax操作从网络读取数据),只能等结果出来,才可以往下执行。

JavaScript语言的设计者意识到,主线程完全可以不管IO设备,把这些等待中的任务挂起,先运行排在后面的任务。等到IO设备返回了结果,再去执行挂起的任务。

因此,所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。

同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;

异步任务指的是,不进入主线程、而进入”任务队列”(task queue)的任务,只有”任务队列”通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

具体来说,异步执行的运行机制如下。(同步执行也是如此,因为它可以被视为没有异步任务的异步执行。)

所有同步任务都在主线程上执行,形成一个执行栈

主线程之外,还存在一个”任务队列”(task queue)。只要异步任务有了运行结果,就在”任务队列”之中放置一个事件。

一旦”执行栈”中的所有同步任务执行完毕,系统就会读取”任务队列”,看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。

主线程不断重复执行上面的第三步。

for(var j = 0; j < 5; j++) {  console.log(j);  setTimeout(function() {    console.log('timeout');  }, 0);}console.log('end');

//结果0 1 2 3 4 end timeout timeout timeout timeout timeout

本文有关“JavaScript单线程和任务队列是什么”的介绍就到这里,如果您已经掌握上述知识,那就赶紧行动实操一下!如果还需要了解更多“JavaScript单线程和任务队列是什么”相关内容,可点击进入Worktile网站相关频道,进行搜索与查询。

文章标题:JavaScript单线程和任务队列是什么,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/14806

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年6月27日
下一篇 2022年6月27日

相关推荐

  • 电脑更新错误0x800f0988如何解决

    解决方法: 方法一: 1、首先点击左下角的开始菜单,然后在其中找到“设置” 2、再点击进入设置中的“更新和安全” 3、然后在左侧边栏中选择“疑难解答” 4、然后在右侧启动并运行中点开“windows更新”,选择“运行疑难解答” 5、最后只要等待系统自动检测问题并解决就可以正常更新了。 方法二: 1、…

    2022年9月16日
    90700
  • 怎样剖析CLDAP协议 Reflection DDoS

    前言 2018年上半年,得益于Memcache近5万的反射放大倍数,DDoS的峰值流量已经达到了一个前所未有的新高度—1.7Tbps,这也使得Memcache ReDDoS成为目前DDoS的中坚力量。而与Memcache ReDDoS相比,2016年Akamai曝光的CLDAP ReDDoS虽然没有…

    2022年9月21日
    92500
  • mathtype下载了用不了如何解决

    mathtype下载了用不了解决方法 1、首先确保我们下载的mathtype是可以使用的,如果不能确定,建议在本站重新下一个。 2、下载安装完成之后,如果还是用不了,打开word点击“文件” 3、选择左下角“选项” 4、进入“信任中心”,点击“信任中心设置” 5、将office的“startup”文…

    2022年9月15日
    42800
  • mysql列转行函数指的是什么

    在mysql中,列转行函数是“group_concat()”函数;该函数用于将非空列值按照分组条件进行合并并最终返回,如果其中有空值则返回的结果是空,语法为“select group_concat(name separator ‘;’)列名 from 表名;”。 本教程操作环…

    2022年9月16日
    2.4K00
  • jquery中子元素选择器和后代元素选择器有哪些区别

    jquery中子元素选择器和后代元素选择器的区别:1、子元素选择器的语法为“$(“父元素>子元素”)”,后代元素选择器的语法为“$(“父元素 子元素”)”;2、子元素选择器只对直接后代产生影响,而对多层后代不产生作用,而后代元素选择器是对所有指定…

    2022年9月2日
    53700
  • 电脑蓝屏0x00000050如何解决

    解决方法: 方法一: 1、应用程序冲突是较好解决的。 2、首先我们重启电脑,然后在开机时按下键盘“F8”,再选择“疑难解答” 3、接着进入高级选项,在其中找到“启动设置” 4、再按下键盘“F4”,尝试进入安全模式。如果可以进入安全模式应该就是应用程序冲突问题。 5、进入安全模式后,只需要在其中将最近…

    2022年9月18日
    75500
  • MySQL约束与多表查询实例分析

    本篇内容主要讲解“MySQL约束与多表查询实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL约束与多表查询实例分析”吧! 1.约束 概述 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。 目的:保证数据库中数据的正确、有效性和…

    2022年9月18日
    87500
  • windows任务管理器被系统管理员停用怎么解决

    任务管理器被管理员停用的恢复方法 1、快捷键Win+R,输入gpedit.msc,回车。 2、依次展开“用户配置–>管理模板–>系统–>Ctrl+Alt+Del选项”,在右侧双击“删除任务管理器” 3、然后在“设置”选项卡中选择未配置或者已禁用选…

    2022年9月6日
    65700
  • 电脑蓝屏代码0xc000000d如何修复

    蓝屏代码0xc000000d修复方法: 问题分析: 1、首先,如果我们突然断点关机或关机前出现卡顿,都可能造成磁盘受损,引发问题。 2、当我们使用电脑,比如:玩游戏、看视频、操作大的东西、使用电脑时间长或着是下载了不合适的东西都会出现这个问题。 PS:如果是这个问题引起的,只要注意自己的电脑不卡机、…

    2022年9月16日
    1.1K00
  • windows该内存不能为read如何解决

    解决该内存不能为read的方法 名列前茅种:内存不能为read工具下载 1、内存不能为read工具在网上有好多版本,小编用过小黑内存不能为read工具,感觉还不错。这款软件通过处理调用CMD指令逐步恢复此BUG,很好的解决了因软件或者系统本身原因产生的不能为read错误 2、双击即可完成修复,重启电…

    2022年9月2日
    58100
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部