js 实现线程
在JavaScript中实现线程可以通过以下几种方式,具体取决于运行环境(浏览器或Node.js)及需求。以下是常见方法:
Web Workers(浏览器环境)
Web Workers允许在后台线程中运行脚本,避免阻塞主线程。适用于CPU密集型任务。
// 主线程代码
const worker = new Worker('worker.js');
worker.postMessage({ data: '任务数据' });
worker.onmessage = (event) => {
console.log('收到Worker回复:', event.data);
};
// worker.js文件内容
self.onmessage = (event) => {
const result = heavyComputation(event.data); // 模拟耗时计算
self.postMessage(result);
};
SharedArrayBuffer + Atomics(共享内存)
配合Web Workers实现线程间共享内存,但需注意线程安全问题。
// 主线程
const sharedBuffer = new SharedArrayBuffer(1024);
const sharedArray = new Int32Array(sharedBuffer);
const worker = new Worker('worker.js');
worker.postMessage({ buffer: sharedBuffer });
// worker.js
self.onmessage = (event) => {
const sharedArray = new Int32Array(event.data.buffer);
Atomics.add(sharedArray, 0, 1); // 原子操作
};
Node.js工作线程
Node.js通过worker_threads模块提供真正的多线程支持。
const { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
const worker = new Worker(__filename);
worker.on('message', (msg) => console.log(msg));
} else {
parentPort.postMessage('来自线程的消息');
}
异步编程模拟
通过setTimeout、Promise、async/await模拟非阻塞操作,适用于I/O密集型任务。

async function parallelTasks() {
const [result1, result2] = await Promise.all([
fetch('api/url1'),
fetch('api/url2')
]);
console.log(result1, result2);
}
注意事项
- Web Workers无法直接操作DOM,需通过
postMessage通信。 - Node.js工作线程适合CPU密集型任务,但每个线程有独立内存空间。
- 共享内存需谨慎处理竞态条件,建议使用Atomics操作。
- 浏览器兼容性需检查(如SharedArrayBuffer受安全策略限制)。






