宏任务由宿主环境调度,每轮事件循环执行一个,如setTimeout、渲染、I/O、事件;微任务由JS引擎调度,当前宏任务结束后立即清空执行,如Promise.then、queueMicrotask、MutationObserver。

区分宏任务和微任务,关键看任务由谁发起、何时执行、以及它被放入哪个队列。
看任务的来源和宿主环境
宏任务由浏览器或 Node.js 等宿主环境调度,代表一次相对独立、完整的工作单元。比如:
- setTimeout、setInterval:定时器回调由宿主环境在指定时间点推入宏任务队列
- UI 渲染(浏览器):页面重绘、重排属于宏任务,每轮事件循环最多执行一次
- I/O 操作(如 fetch 回调、fs.readFile)、用户事件(click、input)也都是宏任务
看任务是否在当前任务结束后立即执行
微任务由 JavaScript 引擎自身调度,在当前宏任务执行完、但尚未进入下一个宏任务前,立刻全部执行。典型特征是“插队快、清空才停”:
- Promise.then/catch/finally:只要 Promise 状态改变,回调就进微任务队列
- queueMicrotask():专为手动插入微任务设计的 API
- MutationObserver(浏览器):监听 DOM 变化后触发的回调也是微任务
- async/await 中 await 后面的代码,本质就是 Promise.then,属于微任务
看执行时机是否受“清空队列”规则约束
微任务队列有明确的“清空”行为:一旦开始执行,就会持续取出并执行,直到队列为空;而宏任务每次只取一个,执行完再检查微任务。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
例如这段代码:
Promise.resolve().then(() => {console.log(1);
Promise.resolve().then(() => console.log(2));
});
输出一定是 1 → 2,因为第二个 Promise.then 是在第一个微任务执行中产生的,仍属于本轮微任务队列,会被立即执行。
简单口诀帮助记忆
✅ 宏任务:外部触发、粒度大、每轮只执行一个——“定时、渲染、IO、事件”
✅ 微任务:JS 引擎内置、响应快、必须清空——“Promise、queueMicrotask、MutationObserver”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










