当前位置: 首页 > 面试题库 >

Javascript是如何单线程的?

魏英勋
2023-03-14
问题内容

我对Javascript的单线程性质有疑问。

console.log("1");
setTimeout(function(){console.log("2");},3000);
console.log("3");
setTimeout(function(){console.log("4");},1000);

此代码的结果是1 3 4 2。如您所见,这4之后2让我感到奇怪的是,在单线程环境中是否应该不应该这样24?如果没有,那么JS怎么知道第二个setTimeout应该在第一个之前完成?难道不应该有两个线程可以同时工作以完成两个setTimeouts以便进行通知EventLoop吗?


问题答案:

JavaScript(在浏览器中) 不能 同时运行2。

最多 一个 的的setTimeout回调可以同时执行-因为有 一个 JavaScript执行上下文或“线程”。

但是,要运行的“下一个计划的超时”始终在下一个运行。“ 4”在“ 2”回调之前运行,因为它 计划更快地运行 。超时是
同一时间有效安排的(没有操作被阻止),但是“ 2”的间隔要长得多。

基础实现 可能 使用线程1-但是,在同一全局上下文 中的 JavaScript 不会 并发运行,并保证所有回调之间的行为 一致原子

1也许不是;可以在select/poll实现中没有任何线程的情况下进行处理。

2在相同的上下文中:例如,Tab / Window,WebWorker,宿主浏览器控件。例如,在同时运行WebWorkers的同时,它们在 不同的
上下文中运行并遵循相同的异步模型(例如,计时器使用的模型)。



 类似资料:
  • 问题内容: 众所周知,JavaScript在所有现代浏览器实现中都是单线程的,但是它是在任何标准中指定的,还是仅根据传统?假设JavaScript始终是单线程的,是否完全安全? 问题答案: 这是个好问题。我很想说“是”。我不能 通常认为JavaScript具有脚本(*)可见的单个执行线程,因此,当您输入内联脚本,事件侦听器或超时时,您将完全处于控制状态,直到从块或函数的结尾返回为止。 (*:忽略浏

  • 问题内容: Scrapy中很少有并发设置,例如CONCURRENT_REQUESTS。这意味着Scrapy搜寻器是多线程的吗?因此,如果我运行它,将在字面上并行触发多个同时请求?我问是因为,我读过Scrapy是单线程的。 问题答案: Scrapy是单线程的,除了交互式外壳程序和一些测试之外,请参见source。 它建立在Twisted的基础上,Twisted也是单线程的,并且利用了它自己的异步并发

  • 根据我的理解,每个Vert.x实例都将被分配一个事件循环。事件循环处理该特定实例的所有请求和其他任务。事件循环是一个线程,我认为。当部署了多个Vert.x实例时,每个实例都有自己的事件循环,对吗?这意味着存在多个线程(multi-threading)。我就是这么理解的。这个单线程概念让我非常头疼。任何帮助都将不胜感激。

  • 是否可以配置使用1个执行线程? 我正在执行在中调用的代码。每次它运行时,我都会遇到不同的运行时行为,这使得研究回归变得很困难。 我希望代码库提供“调试”和“发布”模式。“调试”模式将使用固定种子配置,并使用单个执行线程配置。“释放”模式将使用系统提供的种子,并使用默认数量的线程。 我尝试配置的并行性为1,但它使用2个线程(和第二个工作线程)。有什么想法吗?

  • 问题内容: 我看过OpenJDK的OpenJDK源代码,似乎所有写操作都受同一锁保护,而读操作则根本不受保护。据我了解,在JMM下,对变量的所有访问(读和写)都应受锁保护,否则可能会发生重新排序的效果。 例如,method包含以下几行(处于锁定状态): 另一方面,该方法仅起作用。 在我对JMM的理解中,这意味着如果将语句1-4重新排序为1-2(new)-4-2(copyOf)-3 ,则可能会在不一

  • 本文向大家介绍jvm是如何实现线程的?相关面试题,主要包含被问及jvm是如何实现线程的?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JVM 线程是比进程更轻量级的调度执行单位。线程可以把一个进程的资源分配和执行调度分开。一个进程里可以启动多条线程,各个线程可共享该进程的资源(内存地址,文件IO等),又可以独立调度。线程是CPU调度的基本单位。 主流OS都提供线程实现。Java语言提供对线程