线程

image.png

说明

前端开发者常说:“JavaScript 是单线程的。”这种说法虽然有些简单,但描述了 JavaScript 在浏览器中的一般行为。

单线程就意味着不能像多线程语言那样把工作委托给独立的线程或进程去做。

JavaScript 的单线程可以保证它与不同浏览器 API 兼容。假如 JavaScript 可以多线程执行并发更改,那么像 DOM 这样的 API就会出现问题。

因此,POSIX 线程或 Java 的 Thread 类等传统并发结构都不适合 JavaScript。

而这也正是工作者线程的价值所在:允许把主线程的工作转嫁给独立的实体,而不会改变现有的单线程模型。

WorkerThread简介

JavaScript 环境实际上是运行在托管操作系统中的虚拟环境。

在浏览器中每打开一个页面,就会分配一个它自己的环境。

这样,每个页面都有自己的内存、事件循环、DOM,等等。每个页面就相当于一个沙盒,不会干扰其他页面。

对于浏览器来说,同时管理多个环境是非常简单的,因为所有这些环境都是并行执行的。

使用工作者线程,浏览器可以在原始页面环境之外再分配一个完全独立的二级子环境。

这个子环境不能与依赖单线程交互的 API(如 DOM)互操作,但可以与父环境并行执行代码。