关于多线程有没有类似HarmonyOS 鸿蒙Next的 NSOperation和NSOperationQueue的用法

关于多线程有没有类似HarmonyOS 鸿蒙Next的 NSOperation和NSOperationQueue的用法 比如我可以新建一个operation对象。里面封装一个方法的实现。然后塞到NSOperationQueue里面,在需要的实现调用一下就可以,而且这个过程是按照顺序执行的,promise那种顺序。

按说如果是纯JS的话,直接封装一个函数就可以了,但是arkts经常发生传递过去的函数是无法调用的这个问题。

2 回复

taskpool 可以设置任务的优先级

let task1: taskpool.Task = new taskpool.Task(printArgs, 100);
taskpool.execute(task1, taskpool.Priority.LOW).then((value: Object) => {
  console.info("taskpool result1: " + value);
});

taskool 可以设置任务的依赖关系

@Concurrent
function delay(args: number): number {
  let t: number = Date.now();
  while ((Date.now() - t) < 1000) {
    continue;
  }
  return args;
}

let task1:taskpool.Task = new taskpool.Task(delay, 100);
let task2:taskpool.Task = new taskpool.Task(delay, 200);
let task3:taskpool.Task = new taskpool.Task(delay, 200);

console.info("dependency: add dependency start");
task1.addDependency(task2);
task2.addDependency(task3);
console.info("dependency: add dependency end");

console.info("dependency: start execute second")
taskpool.execute(task1).then(() => {
  console.info("dependency: second task1 success");
})
taskpool.execute(task2).then(() => {
  console.info("dependency: second task2 success");
})
taskpool.execute(task3).then(() => {
  console.info("dependency: second task3 success");
})

上面task1依赖task2,task2依赖task3,最终task3先执行,然后task2,最后执行task1 log 输出

03-04 10:17:08.247  21260-21260 A03d00/JSAPP                    xiaocao.h...lication  I     dependency: add dependency start
03-04 10:17:08.247  21260-21260 A03d00/JSAPP                    xiaocao.h...lication  I     dependency: add dependency end
03-04 10:17:08.247  21260-21260 A03d00/JSAPP                    xiaocao.h...lication  I     dependency: start execute second
03-04 10:17:09.249  21260-21260 A03d00/JSAPP                    xiaocao.h...lication  I     dependency: second task3 success
03-04 10:17:10.250  21260-21260 A03d00/JSAPP                    xiaocao.h...lication  I     dependency: second task2 success
03-04 10:17:11.251  21260-21260 A03d00/JSAPP                    xiaocao.h...lication  I     dependency: second task1 success

taskpool 可使用SequenceRunner用来创建任务队列

SequenceRunner:表示串行队列的任务,用于执行一组需要串行执行的任务

@Concurrent
function additionDelay(delay:number): void {
  let start: number = new Date().getTime();
  while (new Date().getTime() - start < delay) {
    continue;
  }
}

@Concurrent
function waitForRunner(finalString: string): string {
  return finalString;
}

async function seqRunner()
{
  let finalString:string = "";
  let task1:taskpool.Task = new taskpool.Task(additionDelay, 3000);
  let task2:taskpool.Task = new taskpool.Task(additionDelay, 2000);
  let task3:taskpool.Task = new taskpool.Task(additionDelay, 1000);
  let task4:taskpool.Task = new taskpool.Task(waitForRunner, finalString);

  let runner:taskpool.SequenceRunner = new taskpool.SequenceRunner();
  runner.execute(task1).then(() => {
    finalString += 'a';
    console.info("seqrunner: task1 done.");
  });
  runner.execute(task2).then(() => {
    finalString += 'b';
    console.info("seqrunner: task2 done");
  });
  runner.execute(task3).then(() => {
    finalString += 'c';
    console.info("seqrunner: task3 done");
  });
  await runner.execute(task4);
  console.info("seqrunner: task4 done, finalString is " + finalString);
}

上面创建一个串行的任务队列,通过依次执行最后输出finalString log输出

03-04 10:27:40.729  24374-24374 A03d00/JSAPP                    xiaocao.h...lication  I     seqrunner: task1 done.
03-04 10:27:42.735  24374-24374 A03d00/JSAPP                    xiaocao.h...lication  I     seqrunner: task2 done
03-04 10:27:43.736  24374-24374 A03d00/JSAPP                    xiaocao.h...lication  I     seqrunner: task3 done
03-04 10:27:43.742  24374-24374 A03d00/JSAPP                    xiaocao.h...lication  I     seqrunner: task4 done, finalString is abc

文档地址:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V13/js-apis-taskpool-V13#sequencerunner-11

更多关于关于多线程有没有类似HarmonyOS 鸿蒙Next的 NSOperation和NSOperationQueue的用法的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next中,多线程的实现主要依赖于TaskDispatcherTask类,类似于iOS中的NSOperationNSOperationQueueTaskDispatcher用于管理任务的调度和执行,而Task则代表具体的任务单元。

TaskDispatcher提供了多种调度器,如MainTaskDispatcher(主线程调度器)、ParallelTaskDispatcher(并行任务调度器)和SerialTaskDispatcher(串行任务调度器),用户可以根据需求选择合适的调度器。

Task类用于定义具体的任务,可以通过TaskDispatcherasyncDispatchsyncDispatch方法来提交任务。asyncDispatch用于异步执行任务,而syncDispatch用于同步执行任务。

以下是一个简单的示例代码,展示了如何使用TaskDispatcherTask来实现多线程任务调度:

import taskpool from '@ohos.taskpool';

// 定义一个任务
let task = new taskpool.Task(() => {
    console.log("Task is running");
    return "Task result";
});

// 获取并行任务调度器
let dispatcher = taskpool.createParallelTaskDispatcher("myDispatcher", taskpool.Priority.HIGH);

// 异步提交任务
dispatcher.asyncDispatch(task).then((result) => {
    console.log("Task result: " + result);
});

// 同步提交任务
let result = dispatcher.syncDispatch(task);
console.log("Sync task result: " + result);

在这个示例中,TaskDispatcher负责管理任务的调度和执行,Task则定义了具体的任务逻辑。通过asyncDispatchsyncDispatch方法,可以实现任务的异步和同步执行。

鸿蒙Next的多线程机制与iOS的NSOperationNSOperationQueue在功能上相似,但具体实现和API有所不同。开发者可以根据鸿蒙Next的文档和API参考来进一步了解和使用多线程功能。

回到顶部