JavaScript单线程下Web Workers实现并发,主线程与Worker通过postMessage传递可序列化数据协作,Worker需外置同源JS文件,不可操作DOM,错误需单独捕获。

JavaScript 本身是单线程的,但 Web Workers 提供了真正的并发执行能力,让你能在后台线程中运行脚本,避免阻塞主线程(比如 UI 渲染或用户交互)。关键不是“多线程编程”本身,而是**主线程与 Worker 线程之间通过消息传递协作**,不能直接共享内存或变量。
创建并启动 Worker
Worker 必须从外部 JS 文件加载(不能内联),且需同源(协议、域名、端口一致):
- 新建一个文件,例如 worker.js,写入要后台执行的逻辑(如耗时计算、数据解析)
- 在主页面 JS 中用
new Worker('./worker.js')实例化 - Worker 启动后立即执行其脚本,不自动终止,需显式调用
worker.terminate()或让其自然结束
主线程与 Worker 通信:只靠 postMessage
两者完全隔离,所有交互必须通过 postMessage() 发送可序列化的数据(JSON 可表示的值,不包括函数、DOM 节点、undefined):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 主线程发消息:
worker.postMessage({type: 'calculate', data: [1,2,3,4]}) - Worker 接收:
self.onmessage = (e) => { console.log(e.data); } - Worker 回传:
self.postMessage({result: sum}) - 主线程监听:
worker.onmessage = (e) => { console.log(e.data.result); }
处理常见场景:比如大数组排序或图像处理
适合交给 Worker 的任务特征:CPU 密集、无 DOM 操作、输入输出明确:
立即学习“Java免费学习笔记(深入)”;
- 避免在 Worker 中操作
document、alert、localStorage(除indexedDB外多数 API 不可用) - 若需处理大量 JSON 数据,可先在主线程解析好再传入;Worker 处理完再传回结果,由主线程更新 DOM
- 需要频繁通信时,注意消息开销——批量传数据比高频小消息更高效
调试和错误处理不能少
Worker 错误不会冒泡到主线程,容易静默失败:
- 主线程监听
worker.onerror捕获初始化错误(如路径错、语法错) - Worker 内用
self.onerror = () => {...}捕获运行时异常,并主动postMessage通知主线程 - Chrome DevTools 的 Application > Service Workers 标签下可查看活跃 Worker,也可在 Sources 中断点调试 worker.js

















