基于Taskpool的多线程操作
场景描述
场景一:周期性任务处理,业务通过taskpool周期性处理业务。
场景二:延迟业务处理,业务一段时间后,通过taskpool处理业务。
场景三:串行业务处理,业务开展过程中,需要处理一系列的事务,事务处理过程中,存在先后次序。
场景四:业务的处理存在紧急优先次序,支持设置taskpool优先级处理。
场景五:ArkTS与Native协作开展业务,在ArkTS层触发业务,通过NAPI接口,传递到Native C++层,作业务管理等处理。
方案描述
场景一:周期性任务
方案:
- 定时器判断周期性事务执行。
- Taskpool来处理任务执行。
核心代码:
定时器每3秒超时一次,进入TimerOutHandle函数处理,TimerOutHandle函数体中,通过taskpool创建异步并发任务执行业务。
运行结果:
界面上,每超时一次,会呈现运行次数:
场景二:延迟任务
方案:
- 通过setTimeout来延迟处理。
- 通过executeDelayed来延迟处理。
核心代码:
1.setTimeout的处理如下:
定时器3秒超时(仅仅执行一次)后,就会进入TimerOutHandle函数处理,TimerOutHandle函数体中,通过taskpool创建异步并发任务执行业务。
2.executeDelayed来延迟
调用executeDelayed函数3秒后,会进入TaskDelayServiceHandle函数执行,返回返回后,会进入executeDelayed后面的then的函数体中执行。
运行结果:
1.使用setTimeout运行结果
2.使用executeDelayed运行结果
场景三:串行任务
方案:
1.最简单的方案就是后面任务执行时,根据前面任务的执行结果来处理。
2.后面任务的执行,依赖另一个任务的一些处理结果后,继续执行。
核心代码:
1.通过业务逻辑的结果来处理
task1执行完毕后,根据if判断启动task2任务执行。
2.通过addDependency或SequenceRunner处理。
task1依赖task2,task2依赖task3,上面任务执行的顺序是:task3执行完毕后再执行task2,最后执行task。
task1执行完毕后,执行task2,最后是task3执行完毕。
运行结果:
1.通过业务逻辑的结果来处理
2.通过addDependency或SequenceRunner处理
场景四:优先级任务
方案:
在taskpool.execute的参数二种设置线程的优先级,优先级分三个级别:LOW、MEDIUM(默认)、HIGH。通过设置优先级来运行taskpool任务。
核心代码:
当前的设备都是多核的,并不是说将优先级设置程HIGH,该任务就会最先调度。
运行结果:
场景五:taskpool的Napi调用
方案:C++层编译的库,在ArkTS层通过import库的方式引用后,在taskpool的回调函数中调用接口。核心代码:
运行结果: