js实现线程
在JavaScript中,由于语言设计本身是单线程的,无法直接创建传统意义上的线程(如Java或C++中的多线程)。但可以通过以下方式模拟多线程行为或实现并发执行:
Web Workers
Web Workers是浏览器提供的API,允许在后台运行脚本而不阻塞主线程。适用于CPU密集型任务。
// 主线程代码
const worker = new Worker('worker.js');
worker.postMessage({ data: 'start' });
worker.onmessage = (event) => {
console.log('Received:', 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 view = new Int32Array(sharedBuffer);
const worker = new Worker('worker.js');
worker.postMessage({ buffer: sharedBuffer });
// worker.js
self.onmessage = (event) => {
const sharedView = new Int32Array(event.data.buffer);
Atomics.add(sharedView, 0, 1);
};
异步编程
通过Promise、async/await等实现非阻塞操作:
async function fetchData() {
const response = await fetch('api/data');
const data = await response.json();
console.log(data);
}
定时器
使用setTimeout/setInterval实现伪并行(实际仍是单线程):

function task1() {
setTimeout(() => {
console.log('Task 1');
}, 0);
}
function task2() {
console.log('Task 2');
}
task1();
task2(); // 输出顺序:Task 2 → Task 1
注意事项
- Web Workers无法直接操作DOM
- 共享内存需谨慎处理竞态条件
- 大量微任务可能仍会阻塞主线程
- Node.js环境可通过worker_threads模块实现类似功能
对于CPU密集型任务推荐使用Web Workers,I/O密集型任务适合异步方案。实际选择需根据具体场景权衡。






