从API version 20开始,FFRT支持Job Partner功能。在实际业务中,可能会遇到某一个线程(比如UI绘制线程)耗时很长,难以充分利用CPU多核能力的情况。此时,将原有线程的大任务拆分为多个小任务交给其他线程去执行是解决该问题的有效方法。但是,在实践中,会遇到两个问题:
为解决以上问题,Job Partner并发范式应运而生。

Job Partner并发范式中定义原先的线程为master线程,并支持动态管理partner线程(伙伴线程)。它有两个特性:
实现一个商城系统的节点并行化创建,要求节点创建的部分代码片段必须在JS线程中运行,其他片段可以在任意线程执行。
以下是原有伪代码实现:
namespace market_system {
// 批量创建节点,在js线程上被调用
void create_nodes(std::array<Node>& nodes)
{
for (int i = 0; i < nodes.size(); i++) {
code1(); // 可以在任意线程上执行的代码片段
code2(); // 必须在js线程上执行的代码片段
code3(); // 可以在任意线程上执行的代码片段
}
}
}; 使用Job Partner并行化后的伪代码如下:
#include <array>
#include <memory>
#include "ffrt/ffrt.h" // 来自 OpenHarmony 第三方库 "@ppd/ffrt"
namespace market_system {
// 批量创建节点,在js线程上被调用
void create_nodes(std::array<Node>& nodes)
{
constexpr uint64_t stack_size = 16 * 1024;
auto stack = std::make_unique<std::array<char, stack_size>[]>(nodes.size()); // 创建job_num个执行栈
auto partner = ffrt::job_partner<>::get_partner_of_this_thread(); // 获得当前js线程的伙伴
for (int i = 0; i < nodes.size(); i++) {
partner->submit([&] { // 每个节点的创建提交给partner
code1(); // 可以在任意线程上执行的代码片段
ffrt::job_partner<>::submit_to_master([&] { // 遇到必须在master线程执行的任务时发给主线程并同步等待
code2(); // 必须在js线程上执行的代码片段
});
code3(); // 可以在任意线程上执行的代码片段
}, &stack[i], stack_size);
}
partner->wait(); // 等待所有节点创建完成
}
}; 上述样例中涉及的主要FFRT接口及其功能包括:
| 名称 | 描述 |
|---|---|
| job_partner | 细粒度任务伙伴接口。 |