通过 postmessage 的第二个参数 transferlist 传递 arraybuffer 可实现零拷贝。调用方将 buffer 放入列表,接收方直接获得所有权,原 buffer 变为 detached 状态。

Worker 端如何接收并处理数据
在 Worker 中监听 message 事件,从 event.data 获取 buffer。由于所有权已转移,可直接操作该 buffer 而无需复制。

const worker = new Worker('worker.js');
const buffer = new ArrayBuffer(8);
const view = new DataView(buffer);
view.setInt32(0, 42);
// 传递 buffer,第二个参数指定转移列表
worker.postMessage(buffer, [buffer]);
// 此时主线程的 buffer 已失效
console.log(buffer.byteLength); // 0
预期结果:主线程打印 0,表示 buffer 已 detached。Worker 收到完整的 8 字节数据。
主线程如何接收 Worker 返回的数据
主线程同样使用 postMessage 配合 transferList 接收 Worker 返回的 buffer。Worker 发送时指定转移,主线程接收后获得新所有权。

// worker.js
self.onmessage = function(e) {
const buffer = e.data;
const view = new DataView(buffer);
view.setInt32(0, 100);
// 将处理后的 buffer 传回主线程
self.postMessage(buffer, [buffer]);
};
// main.js
worker.onmessage = function(e) {
const receivedBuffer = e.data;
const view = new DataView(receivedBuffer);
console.log(view.getInt32(0)); // 100
};
预期结果:主线程打印 100,表示成功接收 Worker 处理后的数据。
未使用 transferList 会发生什么
如果省略 transferList,ArrayBuffer 会被深拷贝而非转移。这会导致性能开销,且原 buffer 保持可用。适用于小数据量或需要保留原数据的场景。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











