当他们说JavaScript是单线程的时候,这意味着什么?

当他们说JavaScript是单线程的时候,这意味着什么?,javascript,Javascript,很多网站都说JavaScript是单线程的。当他们这么说的时候,他们是指JavaScript运行时吗 我可能有点误解,但JavaScript不只是一种编程语言吗?用它创建的程序应该是标记为单线程的程序吗?但是,也许我不理解一些东西,所以有人能解释一下我没有理解什么吗?JavaScript,一种语言,在线程主题上几乎是沉默的。它是单线程还是多线程取决于它运行的环境。有单线程JavaScript环境和多线程JavaScript环境。该规范唯一真正的要求是线程具有一个线程,并且一旦启动作业(要运行的代

很多网站都说JavaScript是单线程的。当他们这么说的时候,他们是指JavaScript运行时吗

我可能有点误解,但JavaScript不只是一种编程语言吗?用它创建的程序应该是标记为单线程的程序吗?但是,也许我不理解一些东西,所以有人能解释一下我没有理解什么吗?

JavaScript,一种语言,在线程主题上几乎是沉默的。它是单线程还是多线程取决于它运行的环境。有单线程JavaScript环境和多线程JavaScript环境。该规范唯一真正的要求是线程具有一个线程,并且一旦启动作业(要运行的代码单元,如对事件处理程序的调用),它将在该队列中的另一个作业启动之前在线程上运行到完成。也就是说,JavaScript已经运行到完成语义

浏览器上的JavaScript不是单线程的,而且已经多年没有了。有一个主线程(处理UI的线程)和任意数量的线程。web工作人员没有直接访问UI的权限,他们向UI线程发送消息,而UI线程负责UI更新。线程不直接共享数据,而是通过消息显式共享数据。与多线程访问UI和相同的公共数据区域相比,这种分离使得编程多线程代码变得非常简单,并且不容易出错。(在任何线程都可以随时访问任何内容的情况下编写正确的多线程代码是非常困难的)

在浏览器外部,NodeJS中的JavaScript在单个线程上运行。有一个节点分支可以添加多线程,但我认为它从来没有实现过

JVM(Rhino,Nashorn)上的JavaScript始终是多线程的,由JVM的线程设施支持。

JavaScript语言在线程主题上几乎是沉默的。它是单线程还是多线程取决于它运行的环境。有单线程JavaScript环境和多线程JavaScript环境。该规范唯一真正的要求是线程具有一个线程,并且一旦启动作业(要运行的代码单元,如对事件处理程序的调用),它将在该队列中的另一个作业启动之前在线程上运行到完成。也就是说,JavaScript已经运行到完成语义

浏览器上的JavaScript不是单线程的,而且已经多年没有了。有一个主线程(处理UI的线程)和任意数量的线程。web工作人员没有直接访问UI的权限,他们向UI线程发送消息,而UI线程负责UI更新。线程不直接共享数据,而是通过消息显式共享数据。与多线程访问UI和相同的公共数据区域相比,这种分离使得编程多线程代码变得非常简单,并且不容易出错。(在任何线程都可以随时访问任何内容的情况下编写正确的多线程代码是非常困难的)

在浏览器外部,NodeJS中的JavaScript在单个线程上运行。有一个节点分支可以添加多线程,但我认为它从来没有实现过


JVM(Rhino,Nashorn)上的JavaScript一直都是多线程的,由JVM的线程设施支持。

虽然TJC的答案当然是正确的,但我认为它并没有解决人们说“JavaScript是单线程的”时的实际含义问题。他们实际上总结(不准确)的是,运行时的行为必须像只有一个执行线程一样,不能被抢占,并且必须运行到完成。实际运行时可以做任何它喜欢的事情,只要最终结果以这种方式运行

这意味着,虽然JavaScript程序可能看起来与许多相互交互的线程非常并行,但实际上并不是这样。内核使用(简要地)描述的队列、事件循环和运行到完成语义来控制一切

这与硬件描述语言(VHDL、Verilog、SystemC(虽然实际上不是一种语言)面临的问题完全相同。它们在“进程”之间有一个运行时内核周期,而“进程”是不可抢占的,必须运行到定义的挂起点,从而产生了大规模并行的假象。这一点是为了确保以确定的、可重复的方式执行模型

HDL和JS之间的区别在于,这对于HDL来说是非常好的定义和基础,而对于JS来说则是模糊的。这是从的摘录,简要介绍了它-例如,在中定义得更好

由于流程实例执行时没有中断,因此只有一个 进程实例可以在任何时候运行,而没有其他进程 实例可以一直执行到当前正在执行的流程实例 已将控制权让给内核。一个过程不应先发制人或先发制人 中断另一进程的执行。这被称为 合作常规语义或合作多任务处理


虽然TJC的答案当然是正确的,但我认为它并没有解决人们说“JavaScript是单线程的”的实际含义问题。他们实际上总结(不准确)的是,运行时的行为必须像只有一个执行线程一样,不能被抢占,并且必须运行到完成。实际运行时可以做任何它喜欢的事情,只要最终结果以这种方式运行

这意味着,虽然JavaScript程序可能看起来与许多相互交互的线程非常并行,但实际上并不是这样。内核使用(简要地)描述的队列、事件循环和运行到完成语义来控制一切

这是exa