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

导入模块

import { taskpool } from '@kit.ArkTS';

方法示例

  • execute: 将待执行的函数放入taskpool内部任务队列,函数不会立即执行,而是等待分发到工作线程执行。当前执行模式不可取消任务。
@Concurrent
function printArgs(args: number): number {
    console.info("printArgs: " + args);
    return args;
}


taskpool.execute(printArgs, 100).then((value: Object) => { // 100: test number
  console.info("taskpool result: " + value);
});

  • executeDelayed:延时执行任务。当前执行模式可以设置任务优先级和尝试调用cancel进行任务取消。该任务不可以是任务组任务、串行队列任务和周期任务。若该任务非长时任务,可以多次调用executeDelayed执行,长时任务仅支持执行一次。
// import BusinessError
import { BusinessError } from '@kit.BasicServicesKit';


@Concurrent
function printArgs(args: number): void {
    console.info("printArgs: " + args);
}


let t: number = Date.now();
console.info("taskpool start time is: " + t);
let task: taskpool.Task = new taskpool.Task(printArgs, 100); // 100: test number
taskpool.executeDelayed(1000, task).then(() => { // 1000:delayTime is 1000ms
  console.info("taskpool execute success");
}).catch((e: BusinessError) => {
  console.error(`taskpool execute: Code: ${e.code}, message: ${e.message}`);
})

  • executePeriodically:周期执行任务每隔period时长执行一次。当前执行模式支持设置任务优先级,并可以通过调用cancel取消任务周期执行。周期任务不能是任务组任务、串行队列任务或异步队列任务,不能再次调用执行接口,且不能拥有依赖关系。
@Concurrent
function printArgs(args: number): void {
  console.info("printArgs: " + args);
}


@Concurrent
function testExecutePeriodically(args: number): void {
  let t = Date.now();
  while ((Date.now() - t) < args) {
    continue;
  }
  taskpool.Task.sendData(args); // 向宿主线程发送消息
}


function printResult(data: number): void {
  console.info("taskpool: data is: " + data);
}


function taskpoolTest() {
  try {
    let task: taskpool.Task = new taskpool.Task(printArgs, 100); // 100: test number
    taskpool.executePeriodically(1000, task); // 1000: period is 1000ms
  } catch (e) {
    console.error(`taskpool execute-1: Code: ${e.code}, message: ${e.message}`);
  }


  try {
    let periodicTask: taskpool.Task = new taskpool.Task(testExecutePeriodically, 200); // 200: test number
    periodicTask.onReceiveData(printResult);
    taskpool.executePeriodically(1000, periodicTask); // 1000: period is 1000ms
  } catch (e) {
    console.error(`taskpool execute-2: Code: ${e.code}, message: ${e.message}`);
  }
}


taskpoolTest();

Logo

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

更多推荐