javascript通过事件循环与异步调度模拟多线程:微任务(如promise.then)优先执行,宏任务(如settimeout)按序执行;可用taskqueue控制并发、web worker处理cpu密集型任务,或时间戳轮询实现协作式调度。

JavaScript 本身不支持多线程执行(主线程唯一),所谓“多线程模拟”其实是通过事件循环 + 异步任务调度,让多个逻辑看起来“同时进行”。关键不在创建线程,而在合理组织任务的提交、排队、触发与执行时机。
用宏任务与微任务分层调度
事件循环天然支持两级任务优先级:
- 微任务(如 Promise.then、queueMicrotask)在每次宏任务结束后立即清空,适合高响应性逻辑(如状态更新、链式回调)
- 宏任务(如 setTimeout、setInterval、fetch 回调)按队列顺序逐个执行,适合周期性或延时操作(如轮询、心跳、定时 UI 刷新)
- 模拟“并发”的常见做法:把不同功能模块封装成独立的宏任务函数,用 setTimeout(fn, 0) 或 requestAnimationFrame 均匀插入事件循环,避免阻塞
构建轻量级任务队列控制器
不依赖框架也能实现可控调度:
- 定义一个 TaskQueue 类,内部维护待执行任务数组和并发数限制(例如最多同时运行 3 个异步请求)
- 每个任务以 Promise 形式提交,执行完自动触发下一个;失败时可重试或跳过
- 配合 setTimeout 或 queueMicrotask 实现节流、防抖、错峰执行,比如传感器读取每 50ms 一次,UI 更新每 16ms(约 60fps)一次
计算密集型任务交给 Web Worker
真正需要“并行”的场景(如图像处理、加密、大数据排序)应移出主线程:
- Worker 在独立线程运行,不共享内存,通过 postMessage 和 onmessage 通信
- 主线程只负责派发任务、接收结果、更新 DOM;Worker 内部也可使用自己的事件循环处理子任务
- 注意:Worker 不能访问 window、document 等主线程 API,需纯逻辑封装
嵌入式/资源受限环境的协作式调度
类似 STM32 上无 OS 的任务轮询,JS 中也可借鉴思路:
- 用 performance.now() 或 Date.now() 记录时间戳,每个“伪任务”检查是否到执行周期(如 lastExec + 200 )
- 主循环中依次调用各任务函数,不阻塞、不 sleep,靠时间判断是否该跑
- 所有任务共享同一上下文,无栈切换开销,适合低延迟、高确定性场景(如游戏循环、实时仪表盘)











