taskpool使用 ,谁有好的方案?

taskpool使用

HarmonyOS
2024-06-11 20:12:13
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
hmogy

1 文件管理taskPool使用说明

1 实现继承BaseTask的线程类(类中要定义线程池名称)

2 调用TaskManager.getInstance().execute方法执行具体的线程。

execute<T>(task: BaseTask, maxRunningTask: number = 1, isOrder: boolean = true, maxWaitLimit?: number, taskMode: number = TaskConst.TaskExecuteMode.waitToExecute) 

具体例子参考 QueryFolderSubCountTask

使用场景:满足文件管理大部分使用场景,复杂的管理流程,建议也基于BaskTask去实现

Execute方法传参说明:

1)    task:继承BaseTask的task类

2)    maxRunningTask:该线程池同一时间内允许允许的线程个数

3)    isOrder:线程池里面的任务是否按顺序执行,true先添加的先执行,false后添加的先执行

4)    maxWaitLimit: 等待列表最大个数限制。如果未赋值,则对等待列表不限制,如果赋值了,isOrder为true,达到上限后,不在添加,isOrder为false,达到上限后,将前面的舍弃

5)    taskMode:有三种模式用于满足不同场景:

A  executeNow立刻执行:当前有空余线程时,会启动,没有则取消一个正在执行的任务(最早执行的),启动。使用场景:需要最新的执行结果

B executeReject 拒绝执行:当前有空余线程就执行,否则舍弃。使用场景:当前有一个任务执行即可

C execute 按顺序执行:可根据isOrderExecute值为true:先添加的先执行,false后添加的先执行,批量场景

2相关类的说明:

2.1  BaseTask 线程基类,后续所有线程类要继承该基类。

参数介绍:

1)  task:具体待执行的任务

2)  callback:线程执行完的回调,

3)  priority:线程优先级

4)  taskPoolName:线程池的名称,需要设置,否则会被添加到默认的线程池里去

5)  cancelTask: 线程取消方法。

export class BaseTask { 
  /** 
   * 任务 
   */ 
  task?: taskpool.Task; 
 
  /** 
   * 任务执行完回调 
   */ 
  callback?: Function = () => { 
  } 
 
  /** 
   * 线程优先级 
   */ 
  priority: taskpool.Priority = taskpool.Priority.MEDIUM; 
 
  /** 
   * 线程池名称 
   */ 
  taskPoolName: string = ''; 
 
  constructor() { 
  } 
 
  /** 
   * 取消任务,子类在线程中判断isCancel 
   */ 
  cancelTask () { 
    Logger.i(TAG, 'cancel task.'); 
    if (this.task) { 
      taskpool.cancel(this.task); 
    } 
  } 
}

BaseTask子类:

业务后续根据不同的场景,实现BaseTask,并且在该文件类书写实际线程执行的@Concurrent修饰的方法,例子如下

export class TestTask extends BaseTask { 
  constructor(callback: Function) { 
    super() 
    this.taskPoolName = 'TestTask'; 
    this.task = new taskpool.Task(startTask); 
    this.callback = callback; 
  } 
} 
 
@Concurrent 
async function startTask() { 
  const TAG = 'TestTask'; 
  try { 
    Logger.i(TAG, 'startTask ') 
    let count = 0; 
    while(count < 10) { 
      await TimeUtil.sleep(1000); 
      if (taskpool.Task.isCanceled()) { 
        Logger.i(TAG, 'task is cancel'); 
        break; 
      } 
    } 
  } catch (error) { 
    Logger.e(TAG, 'recentFileList fail, error:' + JSON.stringify(error)); 
  } 
} 
;   } }

2.2 TaskExecuteor线程池管理类

该类实现了简单的线程池管理方法。

三种线程执行策略:

1) executeNow立刻执行:当前有空余线程时,会启动,没有则取消一个正在执行的任务(最早执行的),启动。

2)executeReject 拒绝执行:当前有空余线程就执行,否则舍弃。使用场景:当前有一个任务执行即可

3)execute 按顺序执行:可根据isOrderExecute值为true:先添加的先执行,false后添加的先执行

主要参数:

TaskPoolName表示该线程池的名称。

MaxTaskRunningNum表示线程池最大允许同时运行的线程数

MaxWaitLimit:运行等待的最大任务数

isOrderExecutor: 是否按照顺序执行,true: 先添加的先执行,false:后添加的先执行

2.3 TaskManager文件管理封装的统一线程管理类

该类通过map管理一个个线程池,通过execute传进来的task找到相应的taskexecutor(如果没有则新建),然后将task丢给taskexecutor去执行,当线程池空闲时,从map中移除

分享
微博
QQ
微信
回复
2024-06-12 16:38:40
相关问题
转场动画,谁有方案吗?
606浏览 • 1回复 待解决
本地收发消息实践,谁有方案
626浏览 • 1回复 待解决
屏幕旋转计算,有什么方案
951浏览 • 1回复 待解决
Scrollerfling实现有什么方案
789浏览 • 1回复 待解决
Text模拟隐私协议,有方案吗?
782浏览 • 1回复 待解决
连接网络信息获取有方案吗?
655浏览 • 1回复 待解决
har和hsp转换,有方案吗?
698浏览 • 1回复 待解决
鸿蒙小车出厂固件谁有
6099浏览 • 1回复 待解决
包大小优化,有没有解决方案
250浏览 • 2回复 待解决
在鸿蒙中netty有替代方案
62浏览 • 0回复 待解决
订阅emitter分享,谁有更好办法?
745浏览 • 1回复 待解决
谁有办法关闭电池使用时间
6046浏览 • 1回复 待解决
SM4 CBC模式加解密,有方案吗?
1059浏览 • 1回复 待解决
这个iot板子镜像谁有
8229浏览 • 1回复 已解决