本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

一、核心并发分类

1. 线程管理

API模块 核心功能 典型应用场景
Worker 后台线程管理 计算密集型任务
TaskPool 轻量级任务池 短时异步任务
@Concurrent装饰器 标记并发函数

2. 同步机制

API模块 核心功能 典型应用场景
Atomics 共享内存原子操作 多线程数据同步
Lock/Semaphore 互斥锁/信号量 资源访问控制
Barrier 线程屏障 多阶段并行计算

3. 异步编程

API模块 核心功能 典型应用场景
Promise 异步任务链 网络请求处理
async/await 协程式编程 异步流程控制
EventEmitter 事件通知 组件间通信

二、Worker多线程开发

基础使用示例

// 主线程
const worker = new Worker('workers/myWorker.ets');

// 发送消息
worker.postMessage({ command: 'calculate', data: 100 });

// 接收消息
worker.onmessage = (e) => {
  console.log('Result:', e.data);
};

// workers/myWorker.ets
self.onmessage = (e) => {
  if (e.data.command === 'calculate') {
    const result = heavyCalculation(e.data.data);
    self.postMessage(result);
  }
};

高级功能

  • 线程间传输大数据:使用postMessage的transfer参数
  const buffer = new ArrayBuffer(1024);
  worker.postMessage(buffer, [buffer]); // 转移所有权
  • 错误处理
  worker.onerror = (err) => {
    console.error('Worker error:', err);
  };

三、TaskPool任务池

轻量级并发方案

import { taskpool } from '@ohos.taskpool';

@Concurrent
function computeTask(x: number): number {
  return x * x;
}

async function runTask() {
  const task = new taskpool.Task(computeTask, 5);
  const result = await taskpool.execute(task);
  console.log(result); // 25
}

性能特点

  • 相比Worker开销更小
  • 适合短时任务(建议<3秒)
  • 自动负载均衡

四、同步

1. Lock实现

import { Lock } from '@ohos.lock';

const lock = new Lock();

async function safeUpdate() {
  await lock.lock();
  try {
    // 临界区代码
  } finally {
    lock.unlock();
  }
}

2. Semaphore示例

import { Semaphore } from '@ohos.semaphore';

const sem = new Semaphore(3); // 允许3个并发

async function limitedResource() {
  await sem.acquire();
  try {
    // 受限资源访问
  } finally {
    sem.release();
  }
}

五、异步编程

1. Promise链式调用

function fetchData(): Promise<string> {
  return new Promise((resolve) => {
    setTimeout(() => resolve('Data loaded'), 1000);
  });
}

fetchData()
  .then(data => processData(data))
  .catch(err => handleError(err));

2. async/await优化

async function loadContent() {
  try {
    const data = await fetchData();
    const result = await processData(data);
    return result;
  } catch (err) {
    console.error(err);
  }
}

六、并发工具对比

方案 适用场景 内存隔离 通信开销 开发复杂度
Worker 长期后台任务 完全隔离 较高
TaskPool 短期计算任务 部分隔离
@Concurrent 纯计算函数 无隔离 最低 最低

七、建议

  1. 线程选择策略

2. 性能优化技巧

  • 避免频繁创建/销毁Worker
  • 使用transfer减少数据拷贝
  • 合理设置TaskPool大小(默认4个线程)

鸿蒙的并发API体系兼顾了性能与易用性,应根据任务特性选择合适方案。对于复杂场景,可以组合使用多种并发机制,如Worker+Atomics实现高性能计算,或TaskPool+Promise处理并行IO等。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐