HarmonyOS 鸿蒙Next LongTask中启动另外一个LongTask,如何确保新启动的LongTask在新线程之中?

发布于 1周前 作者 zlyuanteng 来自 鸿蒙OS

HarmonyOS 鸿蒙Next LongTask中启动另外一个LongTask,如何确保新启动的LongTask在新线程之中? 前置条件:在一个LongTask之中,使用taskpool.execute(xxx)启动一个新的LongTask.

OS版本:HarmonyOS Next 5.0.0.123 SP19版本

let aNewLongTask = new taskpool.LongTask(threadFunc, xxx);
taskpool.execute(aNewLongTask, taskpool.Priority.MEDIUM);

问题:aNewLongTask这个新的LongTask与原来的LongTask在同一个线程(线程tid一样),如果让aNewLongTask在一个新的线程之中启动?


更多关于HarmonyOS 鸿蒙Next LongTask中启动另外一个LongTask,如何确保新启动的LongTask在新线程之中?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

使用taskpool启动线程时执行的逻辑需要传入函数,必须使用@Concurrent装饰器装饰,能将你线程里面启动线程的完整代码发一下吗?

更多关于HarmonyOS 鸿蒙Next LongTask中启动另外一个LongTask,如何确保新启动的LongTask在新线程之中?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


以下代码运行在一个LongTask线程之中,然后启动另外一个Task

public enqueue(entity: UnZipFileEntity, listener: IUnZipListener) {
  if (!this.isThreadCreated) {
    DownloadLogger.debug(UnZipController.TAG, "start decompress thread");
    this.registerEmitter();
    let unzipThread = new taskpool.LongTask(unzipThreadFunction);
    taskpool.execute(unzipThread, taskpool.Priority.MEDIUM);
    this.isThreadCreated = true;
  }
  .......
}

// 以下是unzipThreadFunction的定义
@Concurrent
export function unzipThreadFunction() {
  UnZipThreadHandler.getInstance().onThreadStart();
}

我现在的问题不是LongTask代码没有执行。

在一个LongTask之中启动另外一个LongTask的时候,另外的LongTask代码有执行了,但是并不是在一个新的线程之中执行,而是仍然在原来的LongTask之中运行。

在HarmonyOS鸿蒙系统中,若要在Next LongTask中启动另外一个LongTask并确保新启动的LongTask在新线程中执行,可以通过任务调度机制与线程管理来实现。

HarmonyOS提供了异步任务调度接口,允许开发者将任务提交给系统任务调度器执行。为确保新启动的LongTask在新线程中,可以利用任务调度器的线程池管理功能,明确指定或让系统分配新线程来执行任务。

具体实现时,可调用相关API创建并启动新的LongTask,同时配置任务属性以确保其在新线程中执行。这通常涉及到任务描述符的设置,包括任务的优先级、执行线程类型等。

示例代码(伪代码):

// 假设存在创建和启动LongTask的API
LongTaskDescriptor newTaskDesc = CreateLongTaskDescriptor();
SetLongTaskThreadType(newTaskDesc, NEW_THREAD); // 假设此函数设置任务在新线程执行

// 配置其他任务属性...

// 启动新LongTask
StartLongTask(newTaskDesc);

注意,上述代码为示意性质,实际API名称和用法需参考HarmonyOS官方文档。

如果问题依旧没法解决请联系官网客服,官网地址是:

回到顶部