js线程实现
JavaScript 线程实现方法
JavaScript 是单线程语言,但可以通过以下方式模拟多线程或实现并行处理:
Web Workers
Web Workers 允许在后台线程中运行脚本,不会影响主线程的性能。
// 主线程代码
const worker = new Worker('worker.js');
worker.postMessage('Hello Worker');
worker.onmessage = function(e) {
console.log('Message received from worker', e.data);
};
// worker.js
self.onmessage = function(e) {
console.log('Message received from main script', e.data);
self.postMessage('Hello Main');
};
Service Workers
Service Workers 是运行在浏览器后台的脚本,可以拦截网络请求、缓存资源等。
// 注册 Service Worker
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
.then(registration => {
console.log('ServiceWorker registration successful');
});
}
SharedArrayBuffer 和 Atomics
共享内存和原子操作可以实现真正的多线程数据共享。
// 主线程
const sharedBuffer = new SharedArrayBuffer(1024);
const sharedArray = new Int32Array(sharedBuffer);
const worker = new Worker('worker.js');
worker.postMessage({buffer: sharedBuffer});
// worker.js
self.onmessage = function(e) {
const sharedArray = new Int32Array(e.data.buffer);
Atomics.add(sharedArray, 0, 1);
};
Node.js 工作线程
Node.js 提供了 worker_threads 模块实现多线程。
const { Worker, isMainThread } = require('worker_threads');
if (isMainThread) {
const worker = new Worker(__filename);
worker.on('message', (msg) => {
console.log(msg);
});
} else {
parentPort.postMessage('Hello from worker');
}
异步编程
虽然不创建新线程,但 async/await 和 Promise 可以实现非阻塞操作。
async function fetchData() {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
return data;
}
这些方法各有适用场景:Web Workers 适合 CPU 密集型任务,Service Workers 适合离线应用和缓存,Node.js 工作线程适合服务器端并行处理,异步编程则适合 I/O 密集型操作。







