web worker 优化核心是拆逻辑、消息通信、高效传输:worker 需纯计算、无 dom 访问;主线程用 transferable 零拷贝传大数据;长任务须分片+进度反馈;用完及时 close 或 terminate 避免内存泄漏。

直接把耗时计算放进 Web Worker,核心就三点:拆出纯逻辑、走消息通信、管好数据传输。不是简单“扔进新线程”就完事,关键在怎么拆、怎么传、怎么收。
写一个独立的 worker 脚本,只放计算逻辑
Worker 文件(比如 calc.worker.js)不能访问 DOM、不能用 window 或 document,只能做纯运算。它是一个封闭环境,全局是 self,不是 window。
- 导出函数要自包含:所有依赖(如工具函数、常量)都得写进去或通过
importScripts加载,不能靠主线程变量 - 监听输入用
self.onmessage,返回结果用self.postMessage() - 避免副作用:不修改外部状态,不发起意外请求,不打 console(调试可用
self.console,但上线建议关掉)
主线程启动并通信,别卡在序列化上
主线程用 new Worker('./calc.worker.js') 创建实例,但真正影响性能的往往是 postMessage() 这一步——默认会深拷贝整个对象。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 小数据(几千个数字、普通对象)直接传没问题
- 大数据(如图像像素数组、百万级 JSON)必须用
Transferable:把ArrayBuffer或TypedArray加到transfer数组里,实现零拷贝 - 示例:
worker.postMessage(data, [data.buffer])—— 主线程立刻失去对data.buffer的控制权,Worker 拿到的是同一块内存
任务别单次跑死,支持分片和进度反馈
哪怕进了 Worker,一个 3 秒的同步循环照样会让 Worker 线程“卡住”,无法响应中间消息。所以长任务要主动切片 + 主动发进度。
- 在 Worker 内部用
setTimeout或requestIdleCallback分批处理,每处理完一批就postMessage({ type: 'progress', value: 0.3 }) - 主线程监听
onmessage,根据e.data.type区分结果、进度、错误,再更新 UI 或取消按钮 - 避免“发一次等三秒”,改成“发多次,每次快,可中断”
用完记得清理,别留僵尸 Worker
Worker 不会自动销毁,长期闲置会占内存,尤其在频繁创建的场景下(比如每次筛选都新建一个)。
- 任务完成时,Worker 内调用
self.close(),主线程调用worker.terminate() - 更稳妥的做法是建个轻量任务池:复用固定数量的 Worker(比如 2–4 个),用队列管理任务,避免反复初始化开销
- 加超时机制:主线程设
setTimeout,超过阈值没收到结果就terminate并报错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










