HarmonyOS 异步接口是否会启动一个子线程来执行其中的逻辑?
HarmonyOS 异步接口是否会启动一个子线程来执行其中的逻辑?
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
销毁一个子窗口的方法
315浏览 • 1回复 待解决
如何指定多个异步任务在同一个辅助线程内执行
769浏览 • 0回复 待解决
由UIAbility创建的一个子窗口,能配置为可拖动吗
1599浏览 • 1回复 待解决
HarmonyOS 同一个父组件中的其中一个grid拖拽其中item 怎么避免影响其他的grid?
192浏览 • 1回复 待解决
关于鸿蒙napi的异步机制的疑问,执行逻辑是跑在js线程上吗?
7825浏览 • 1回复 待解决
UIAbility在onBackground执行耗时操作时是否会影响另外一个UIAbility的onForeground
1919浏览 • 1回复 待解决
Ability在onBackground执行耗时操作时是否会影响另外一个Ability的onForeground
1715浏览 • 1回复 待解决
主线程怎么才能判断子线程是否已经执行结束了
6677浏览 • 1回复 待解决
Native子线程切回主线程传递的env是否会变化
1652浏览 • 1回复 待解决
#鸿蒙学习大百科#如何通过WindowStage创建一个子窗口?
221浏览 • 1回复 待解决
HarmonyOS multinavigation库适配平行视界时是否有统一拦截第一个子页面继续出栈的行为
261浏览 • 1回复 待解决
HarmonyOS 一个Row组件包含N+1个子组件,前N个组件尺寸不固定,最后一个组件要求填满Row组件剩下的空间
185浏览 • 1回复 待解决
ArkTS是否有全局强制切换线程执行和调度的接口
2192浏览 • 1回复 待解决
HarmonyOS在异步线程往主线程抛任务无法被执行
287浏览 • 1回复 待解决
启动一个已启动的Ability,什么情况下才会执行onNewWant()回调
1993浏览 • 1回复 待解决
启动一个已启动的UIAbility,什么情况下才会执行onNewWant()回调
1981浏览 • 1回复 待解决
HarmonyOS怎样判断一个实例是否实现了某个接口
482浏览 • 1回复 待解决
ArkTS线程模型中是否是每个线程跑一个runtime实例
1819浏览 • 1回复 待解决
HarmonyOS 如何将一个异步的方法包装成同步的方法,在程序中顺序执行?
317浏览 • 1回复 待解决
ArkTS是否提供了全局强制线程切换执行和调度的接口?
362浏览 • 1回复 待解决
HarmonyOS row包含一个image,一个text,text会超过row的边界
405浏览 • 1回复 待解决
napi_create_async_work 接口创建的线程数量,最多能有多少个,是否是一个进程上限8个?
311浏览 • 1回复 待解决
启动一个Ability后,如何感知该Ability的销毁,并执行某些操作
1903浏览 • 1回复 待解决
启动一个UIAbility后,如何感知该UIAbility的销毁,并执行某些操作
2024浏览 • 1回复 待解决
异步机制ArkTS仅在单线程(主线程)上执行任务,其异步机制与JavaScript一致,都是通过宿主环境提供的线程实现(napi,其接口与nodejs一致),即通过EventLoop实现。
EventLoopEventLoop负责循环监视调用堆栈和回调队列,如果调用堆栈为空,它将从回调队列中获取第一个事件,并将其推送到调用堆栈。
以setTimeout为例:
console.log(‘Hi’);setTimeout(function cb1() {console.log(‘cb1’);}, 5000);console.log(‘Bye’);执行顺序:
console.log(‘Hi’); 该语句被添加到调用堆栈中,随着执行完,被移除调用堆栈;
setTimeout(function cb1() { … });该语句首先被添加到调用堆栈,被执行时,宿主环境创建了一个计时器,为代码计时。当该语句被执行完,会被移除调用堆栈。
等待至少5000ms,定时器执行完,把cb1回调函数添加到回调队列里面,EventLoop把cb1从回调队列中取出,添加到调用堆栈中。
注意,setTimeout中设置的时间,是计时器过期时将回调放入回调队列的时间,而不是回调函数被执行的时间(只有调用栈是空的,EventLoop才会从调用栈中取)
执行顺序与JavaScript一样,AkrTs也存在宏任务(Macrotask)队列和 微任务(Microtask)队列。宏任务例如setTimeout、setInterval,微任务例如普通回调函数,Promise相关函数等。
其执行顺序为:从 宏任务 队列中出队并执行最早的任务(只执行一个);执行所有微任务当微任务队列非空时:出队(dequeue)并执行最早的微任务;继续检查微任务队列空不空(即执行完所有的微任务,新创建的微任务会立即进入微任务队列排队执行,不需要等待下一次轮回);如果有变更,则将变更渲染出来;如果宏任务队列为空,则休眠直到出现宏任务;转到步骤 1。举例
setTimeout(() => hilog.debug(0, TAG, “timeout”));new Promise<void>((resolve, reject) => {hilog.debug(0, TAG, “resolve”);resolve();}).then(() => hilog.debug(0, TAG, “promise”));hilog.debug(0, TAG, “code”);执行顺序:
resolve最先显示,因为Promise内的代码也是同步执行;
code 接着显示,因为它是常规的同步调用;
promise 第二个出现,因为 then 会通过微任务队列,并在当前代码之后执行;
timeout 最后显示,因为它是一个宏任务。