关于多线程有没有类似HarmonyOS 鸿蒙Next的 NSOperation和NSOperationQueue的用法
关于多线程有没有类似HarmonyOS 鸿蒙Next的 NSOperation和NSOperationQueue的用法
比如我可以新建一个operation
对象。里面封装一个方法的实现。然后塞到NSOperationQueue
里面,在需要的实现调用一下就可以,而且这个过程是按照顺序执行的,promise那种顺序。
按说如果是纯JS的话,直接封装一个函数就可以了,但是arkts
经常发生传递过去的函数是无法调用的这个问题。
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
更多关于关于多线程有没有类似HarmonyOS 鸿蒙Next的 NSOperation和NSOperationQueue的用法的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在鸿蒙Next中,多线程的实现主要依赖于TaskDispatcher
和Task
类,类似于iOS中的NSOperation
和NSOperationQueue
。TaskDispatcher
用于管理任务的调度和执行,而Task
则代表具体的任务单元。
TaskDispatcher
提供了多种调度器,如MainTaskDispatcher
(主线程调度器)、ParallelTaskDispatcher
(并行任务调度器)和SerialTaskDispatcher
(串行任务调度器),用户可以根据需求选择合适的调度器。
Task
类用于定义具体的任务,可以通过TaskDispatcher
的asyncDispatch
或syncDispatch
方法来提交任务。asyncDispatch
用于异步执行任务,而syncDispatch
用于同步执行任务。
以下是一个简单的示例代码,展示了如何使用TaskDispatcher
和Task
来实现多线程任务调度:
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
则定义了具体的任务逻辑。通过asyncDispatch
和syncDispatch
方法,可以实现任务的异步和同步执行。
鸿蒙Next的多线程机制与iOS的NSOperation
和NSOperationQueue
在功能上相似,但具体实现和API有所不同。开发者可以根据鸿蒙Next的文档和API参考来进一步了解和使用多线程功能。