任务池(taskpool)作用是为应用程序提供一个多线程的运行环境,降低整体资源的消耗、提高系统的整体性能,且您无需关心线程实例的生命周期。您可以使用任务池API创建后台任务(Task),并对所创建的任务进行如任务执行、任务取消的操作。理论上您可以使用任务池API创建数量不受限制的任务,但是出于内存因素不建议您这样做。此外,不建议您在任务中执行阻塞操作,特别是无限期阻塞操作,长时间的阻塞操作占据工作线程,可能会阻塞其他任务调度,影响您的应用性能。

您所创建的同一优先级任务的执行顺序可以由您决定,任务真实执行的顺序与您调用任务池API提供的任务执行接口顺序一致。任务默认优先级是MEDIUM。

当同一时间待执行的任务数量大于任务池工作线程数量,任务池会根据负载均衡机制进行扩容,增加工作线程数量,减少整体等待时长。同样,当执行的任务数量减少,工作线程数量大于执行任务数量,部分工作线程处于空闲状态,任务池会根据负载均衡机制进行缩容,减少工作线程数量。

taskpool.execute

execute(func: Function, ...args: Object[]): Promise<Object>

将待执行的函数放入taskpool内部任务队列, 函数不会立即执行,而是等待分发到工作线程执行。当前执行模式不可取消任务。;

taskpool.execute

execute(task: Task, priority?: Priority): Promise<Object>

将创建好的任务放入taskpool内部任务队列,任务不会立即执行,而是等待分发到工作线程执行。当前执行模式可以设置任务优先级和尝试调用cancel进行任务取消。该任务不可以是任务组任务和串行队列任务。若该任务非长时任务,可以多次调用执行,长时任务仅支持执行一次。

示例:

@Concurrent

function printArgs(args: number): number {

console.info("printArgs: " + args);

return args;

}

let task1: taskpool.Task = new taskpool.Task(printArgs, 100); // 100: test number

let task2: taskpool.Task = new taskpool.Task(printArgs, 200); // 200: test number

let task3: taskpool.Task = new taskpool.Task(printArgs, 300); // 300: test number

taskpool.execute(task1, taskpool.Priority.LOW).then((value: Object) => {

console.info("taskpool result1: " + value);

});

taskpool.execute(task2, taskpool.Priority.MEDIUM).then((value: Object) => {

console.info("taskpool result2: " + value);

});

taskpool.execute(task3, taskpool.Priority.HIGH).then((value: Object) => {

console.info("taskpool result3: " + value);

});

taskpool.execute10+

execute(group: TaskGroup, priority?: Priority): Promise<Object[]>

将创建好的任务组放入taskpool内部任务队列,任务组中的任务不会立即执行,而是等待分发到工作线程执行。任务组中任务全部执行完成后,结果数组统一返回。当前执行模式适用于执行一组有关联的任务。

taskpool.executeDelayed11+

executeDelayed(delayTime: number, task: Task, priority?: Priority): Promise<Object>

延时执行任务。当前执行模式可以设置任务优先级和尝试调用cancel进行任务取消。该任务不可以是任务组任务、串行队列任务和周期任务。若该任务非长时任务,可以多次调用executeDelayed执行,长时任务仅支持执行一次。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐