问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

在一个浏览器里同时开着多个网页算是多线程吗?

发布网友 发布时间:2022-05-14 12:29

我来回答

3个回答

懂视网 时间:2022-04-23 10:54

认为setTimeout中的问候方法会立即被执行,因为这并不是凭空而说,而是JavaScript API文档明确定义第二个参数意义为隔多少毫秒后,回调方法就会被执行. 这里设成0毫秒,理所当然就立即被执行了.
同理对setInterval的callbackFunction方法每间隔100毫秒就立即被执行深信不疑!

但随着JavaScript应用开发经验不断的增加和丰富,有一天你发现了一段怪异的代码而百思不得其解:

[javascript] view plain copy print?在CODE上查看代码片派生到我的代码片

  1. p.onclick = function(){

  2. setTimeout( function(){document.getElementById(’inputField’).focus();}, 0);

  3. };

既然是0毫秒后执行,那么还用setTimeout干什么, 此刻, 坚定的信念已开始动摇.
直到最后某一天 , 你不小心写了一段糟糕的代码:

[javascript] view plain copy print?在CODE上查看代码片派生到我的代码片

  1. setTimeout( function(){ while(true){} } , 100);

  2. setTimeout( function(){ alert(’你好!’); } , 200);

  3. setInterval( callbackFunction , 200);

第一行代码进入了死循环,但不久你就会发现,第二,第三行并不是预料中的事情,alert问候未见出现,callbacKFunction也杳无音讯!

这时你彻底迷惘了,这种情景是难以接受的,因为改变长久以来既定的认知去接受新思想的过程是痛苦的,但情事实摆在眼前,对JavaScript真理的探求并不会因为痛苦而停止,下面让我们来展开JavaScript线程和定时器探索之旅!

拔开云雾见月明

出现上面所有误区的最主要一个原因是:潜意识中认为,JavaScript引擎有多个线程在执行,JavaScript的定时器回调函数是异步执行的.

而事实上的,JavaScript使用了障眼法,在多数时候骗过了我们的眼睛,这里背光得澄清一个事实:

JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序.

JavaScript引擎用单线程运行也是有意义的,单线程不必理会线程同步这些复杂的问题,问题得到简化.

那么单线程的JavaScript引擎是怎么配合浏览器内核处理这些定时器和响应浏览器事件的呢?
下面结合浏览器内核处理方式简单说明.

浏览器内核实现允许多个线程异步执行,这些线程在内核制控下相互配合以保持同步.假如某一浏览器内核的实现至少有三个常驻线程:javascript引擎线程,界面渲染线程,浏览器事件触发线程,除些以外,也有一些执行完就终止的线程,如Http请求线程,这些异步线程都会产生不同的异步事件,下面通过一个图来阐明单线程的JavaScript引擎与另外那些线程是怎样互动通信的.虽然每个浏览器内核实现细节不同,但这其中的调用原理都是大同小异.

由图可看出,浏览器中的JavaScript引擎是基于事件驱动的,这里的事件可看作是浏览器派给它的各种任务,这些任务可以源自JavaScript引擎当前执行的代码块,如调用setTimeout添加一个任务,也可来自浏览器内核的其它线程,如界面元素鼠标点击事件,定时触发器时间到达通知,异步请求状态变更通知等.从代码角度看来任务实体就是各种回调函数,JavaScript引擎一直等待着任务队列中任务的到来.由于单线程关系,这些任务得进行排队,一个接着一个被引擎处理.

上图t1-t2..tn表示不同的时间点,tn下面对应的小方块代表该时间点的任务,假设现在是t1时刻,引擎运行在t1对应的任务方块代码内,在这个时间点内,我们来描述一下浏览器内核其它线程的状态.

t1时刻:

GUI渲染线程:

该线程负责渲染浏览器界面HTML元素,当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行.本文虽然重点解释JavaScript定时机制,但这时有必要说说渲染线程,因为该线程与JavaScript引擎线程是互斥的,这容易理解,因为JavaScript脚本是可操纵DOM元素,在修改这些元素属性同时渲染界面,那么渲染线程前后获得的元素数据就可能不一致了.

在JavaScript引擎运行脚本期间,浏览器渲染线程都是处于挂起状态的,也就是说被”冻结”了.

所以,在脚本中执行对界面进行更新操作,如添加结点,删除结点或改变结点的外观等更新并不会立即体现出来,这些操作将保存在一个队列中,待JavaScript引擎空闲时才有机会渲染出来.

GUI事件触发线程:

JavaScript脚本的执行不影响html元素事件的触发,在t1时间段内,首先是用户点击了一个鼠标键,点击被浏览器事件触发线程捕捉后形成一个鼠标点击事件,由图可知,对于JavaScript引擎线程来说,这事件是由其它线程异步传到任务队列尾的,由于引擎正在处理t1时的任务,这个鼠标点击事件正在等待处理.

定时触发线程:

注意这里的浏览器模型定时计数器并不是由JavaScript引擎计数的,因为JavaScript引擎是单线程的,如果处于阻塞线程状态就计不了时,它必须依赖外部来计时并触发定时,所以队列中的定时事件也是异步事件.

由图可知,在这t1的时间段内,继鼠标点击事件触发后,先前已设置的setTimeout定时也到达了,此刻对JavaScript引擎来说,定时触发线程产生了一个异步定时事件并放到任务队列中, 该事件被排到点击事件回调之后,等待处理.
同理, 还是在t1时间段内,接下来某个setInterval定时器也被添加了,由于是间隔定时,在t1段内连续被触发了两次,这两个事件被排到队尾等待处理.

可见,假如时间段t1非常长,远大于setInterval的定时间隔,那么定时触发线程就会源源不断的产生异步定时事件并放到任务队列尾而不管它们是否已被处理,但一旦t1和最先的定时事件前面的任务已处理完,这些排列中的定时事件就依次不间断的被执行,这是因为,对于JavaScript引擎来说,在处理队列中的各任务处理方式都是一样的,只是处理的次序不同而已.

t1过后,也就是说当前处理的任务已返回,JavaScript引擎会检查任务队列,发现当前队列非空,就取出t2下面对应的任务执行,其它时间依此类推,由此看来:

如果队列非空,引擎就从队列头取出一个任务,直到该任务处理完,即返回后引擎接着运行下一个任务,在任务没返回前队列中的其它任务是没法被执行的.

相信您现在已经很清楚JavaScript是否可多线程,也了解理解JavaScript定时器运行机制了,下面我们来对一些案例进行分析:

案例1:setTimeout与setInterval

[javascript] view plain copy print?在CODE上查看代码片派生到我的代码片

  1. setTimeout(function(){

  2. /* 代码块... */

  3. setTimeout(arguments.callee, 10);

  4. }, 10);


  5. setInterval(function(){

  6. /*代码块... */

  7. }, 10);

这两段代码看一起效果一样,其实非也,第一段中回调函数内的setTimeout是JavaScript引擎执行后再设置新的setTimeout定时, 假定上一个回调处理完到下一个回调开始处理为一个时间间隔,理论两个setTimeout回调执行时间间隔>=10ms.第二段自setInterval设置定时后,定时触发线程就会源源不断的每隔十秒产生异步定时事件并放到任务队列尾,理论上两个setInterval回调执行时间间隔<=10.

案例2:ajax异步请求是否真的异步?

很多同学朋友搞不清楚,既然说JavaScript是单线程运行的,那么XMLHttpRequest在连接后是否真的异步?
其实请求确实是异步的,不过这请求是由浏览器新开一个线程请求(参见上图),当请求的状态变更时,如果先前已设置回调,这异步线程就产生状态变更事件放到JavaScript引擎的处理队列中等待处理,当任务被处理时,JavaScript引擎始终是单线程运行回调函数,具体点即还是单线程运行onreadystatechange所设置的函数.

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

单线程JS与多线程浏览器的使用

关于js中类型转换的一些小问题

JS中的显示类型转换

js怎样实现横向滚动与浮动导航

热心网友 时间:2022-04-23 08:02

在解释上面这些问题的之前,我们得理解线程的一个概念。

在现代操作系统中,线程是真正执行计算机操作的东西,真正在操作电脑的不是应用程序,不是进程,而是线程。

线程,是一个基本单位,执行操作的,是线程。

应用程序与进程里面,有很多线程,像负责人机交互的窗口,它主要由 GUI 线程来控制的。

以 IE 浏览器为例,即便你只开启一个页面,你也会发现,这个浏览器程序有非常多的线程,随着打开的标签和加载项越多,它所创建的线程也就越多。

我做过一些简单的应用软件开发,对于一般应用程序来说,我们也许不考虑线程的问题,因为,关于线程的调度,我个人会让系统和编译器来完成,而我做的,仅仅是为了编写实现这个软件的功能以及代码。

上面这个截图是我编写的一个小工具,用于学习一些计算机编码的一些问题,由于这个软件是我编写的(基于 .net 4.5 架构),所以,我对此软件最为了解。

这个程序在启动的最初状态,程序不参与任何计算工作,这个程序中,它只有简单的基本图形界面,比如:窗口 ,窗口里有一个菜单栏,在任务管理器中,它显示了这个程序只占用了 4 个线程。

当我启动一个功能的时候,这个程序的线程数一下子增加到了  16 个 。

所以,这个问题的标题,并不能很好的说明操作系统的多线程。

热心网友 时间:2022-04-23 09:20

不一定,要看浏览器具体实现。
一般来说,最近的浏览器版本,比如 Chrome 最近一两年之内的版本,每个 tab 页都是独立进程,而不是线程。这个只要查看一下系统进程管理就能看到的,谷歌官方也有过说明。
旧的浏览器是不起独立进程的,可能会为每个 tab 启动一个线程。这只是猜测了,没有依据。
可以等高人回复
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...我想退掉一张办后从未用过的工商银行的牡丹灵通卡,应该怎么做呢?要... 今天办理了工商银行卡,顺带开通网银,要每年缴费10元,手机也要收费,很麻... Microsoft VBScript 运行时错误 (0x800A000D)类型不匹配: 'rsup' 关于VFP,谁知道这个为什么报操作符/操作数类型不匹配啊! 数据查询提示“数据类型不匹配” ...介绍《天下无贼》的歌曲说明:谁能告诉我阿 ? ...不起来叫什么名了·请弟兄姊妹帮帮忙·急需···里面的歌词是... ...你是千堆雪我是长街,怕日出一到彼此瓦解这句歌词的意思? 两个人合伙开一个室内设计工作室,都是男的,求一个响亮内涵的名字!高 ... 饥荒红薯怎么种植 在一个浏览器里面下载了一个东西,就像中病毒了一样,怎么办 法律上男方在结婚前有贷款,结婚后女方有义务还吗? 夫妻一方的借款另一方需要还吗 博士冰箱KMF40S50TI怎样设置温度,有电子说明书吗 我想要这款冰箱的使用说明书,如何调试 博世双开门冰箱,显示屏上的摄氏度变成了华氏度,请问要怎么切换回来?? 双开门博世冰箱有多少重? 戴尔笔记本电脑的DOCK工具栏 准妈妈的话肚里宝宝真能听到吗?何时对话好?应该说些什么? 22周宝宝能听到妈妈说话吗 怀孕2个月宝宝可以听到妈妈说话吗 可以听见妈妈说话怀孕几个月宝宝才能听到妈妈说话 胎宝宝什么时候可以听到妈妈说话 怀孕多久BB能听见妈妈说话? 宝宝多大能听懂妈妈的话,妈妈要注意什么呢? 孩子能够听懂爸爸妈妈的语言吗?是从什么时候能听懂的? 胎儿能够听到母亲说的话吗? 豆芽用土怎么种 已知a分之一比b分之一比c分之一等于三比四比五 求a比b比c等于几比几比几? 只要详细过程 答案是六比三比四 已知a分之一减b分之一等于-2,求代数式3ab-a+b分之3a+ab-3b的值 夫妻一方要贷款,另一方信用卡负债是还了好,还是把钱留在余额慢慢还 怎么在一个浏览器上能打开好几个网页 夫妻一方在外借款 不知情的另一方有义务还钱吗 夫妻之间,丈夫使用妻子手机贷款,但却并不还钱让妻子还债,妻子有必要还债吗,丈夫是否需负法律责任 为什么当我在一个浏览器打开多个网页时,从当前页再点击前面打开的网页时,前面的网页为什么总是被关闭, 打开几个网页为什么同时在一个浏览器上浏览,怎么解决? 我的浏览器怎么只能在一个浏览器里打开若干个网页呢 如何设置在一个浏览器里打开网页? 怎样让多个窗口在一个浏览器上? 离婚需要提前一个月申请吗 离婚需要预约后一个月才能办理吗 离婚预约时间还不到一个月,可以向法院递交离婚申请书吗? 女方单方在网上预约离婚到民政局以后还需要一个月冷静期吗 想要申请离婚,离婚不预约可以办理吗? 新手做期货,用多少钱做合适? 东莞最新购房限购*下在莞领取退休金的职工是否有购房资格能否贷款购房? 双方同意离婚可以直接去民政局办理吗? 在彭阳县草庙乡想要离婚,可以顺利的办理离婚判决书吗? win7 安装到C盘,大概需要占多大的空间?? 离婚 需要提前一个月预约吗