第12章_HarmonyOs开发图解 线程管理

📅 2026/7/27 23:13:01
第12章_HarmonyOs开发图解 线程管理
第12章 HarmonyOs开发图解 线程管理HarmonyOS 学习系统 | 阶段三高级深耕期学习目标序号能力1掌握四种 TaskDispatcher 的使用场景与区别2能够使用 EventHandler 实现线程间通信3理解任务优先级、任务组等高级调度机制核心图解内容讲解12.1 线程管理概述HarmonyOS 的线程管理基于 TaskDispatcher任务分发器机制它不同于 Java 标准的 Thread 或 ExecutorService而是专门为 HarmonyOS 应用设计的任务调度框架。TaskDispatcher 的核心思想是按需分派——根据任务类型UI 更新、并行计算、串行排队选择合适的分发器。生活化类比TaskDispatcher 就像快递分拣中心想象一个大型快递分拣中心快递员任务到达后分拣中心根据包裹类型分配到不同的处理线。GlobalTaskDispatcher像公共处理线任何包裹都能丢进去并行处理ParallelTaskDispatcher像你租的专用处理线可以同时处理多个包裹但独立于其他线SerialTaskDispatcher像单人窗口包裹必须排队一个一个来UITaskDispatcher像 VIP 柜台只能在前台处理 UI 相关包裹。12.2 四种 TaskDispatcher 详解12.2.1 GlobalTaskDispatcher全局并发分发器全局并发分发器是应用级别唯一的并发任务分发器适合执行无先后顺序要求的并发任务。// 获取全局并发分发器TaskDispatcherglobalgetGlobalTaskDispatcher(TaskPriority.DEFAULT);// 异步派发任务global.asyncDispatch(newRunnable(){Overridepublicvoidrun(){// 在后台线程执行耗时操作StringresultdoHeavyWork();// 回到UI线程更新界面getUITaskDispatcher().syncDispatch(()-{textComponent.setText(result);});}});12.2.2 ParallelTaskDispatcher并行分发器并行分发器可以创建多个实例每个实例有自己的任务队列适合对任务分组并行处理。// 创建并行分发器可创建多个独立实例TaskDispatcherparallelcreateParallelTaskDispatcher(myParallel,TaskPriority.DEFAULT);12.2.3 SerialTaskDispatcher串行分发器串行分发器保证任务按添加顺序依次执行适合有依赖关系的任务链。// 创建串行分发器TaskDispatcherserialcreateSerialTaskDispatcher(mySerial,TaskPriority.DEFAULT);12.2.4 UITaskDispatcherUI 线程分发器UI 线程分发器专门用于在主线程更新 UI任何 UI 操作都必须通过它来执行。// 获取UI线程分发器TaskDispatcheruigetUITaskDispatcher();// 在UI线程执行任务ui.syncDispatch(()-{textComponent.setText(更新完成);});12.3 任务组与任务同步TaskDispatcher 支持任务组TaskGroup机制可以实现等待多个任务完成后再执行的同步需求。// 任务组task3 等待 task1、task2 完成后执行TaskGroupgroupnewTaskGroup();serial.asyncGroupDispatch(group,newMyTask1());// task1serial.asyncGroupDispatch(group,newMyTask2());// task2serial.groupDispatchNotify(group,newMyTask3());// task1、task2完成后执行task312.4 EventHandler 线程间通信EventHandler 机制类似 Netty/Node.js 的事件循环器。主线程创建子线程做耗时操作如下载图片子线程完成后通过 EventHandler 通知主线程更新 UI。// 创建 EventRunner 和 EventHandlerEventRunnerrunnerEventRunner.create(MyRunner);MyEventHandlerhandlernewMyEventHandler(runner);// 发送事件InnerEventeventInnerEvent.get(eventId,0,data);handler.sendEvent(event);// 自定义事件处理器classMyEventHandlerextendsEventHandler{OverrideprotectedvoidprocessEvent(InnerEventevent){// 在子线程中处理事件inteventIdevent.eventId;Objectdataevent.object;// 处理完成后通过 UITaskDispatcher 更新 UIgetUITaskDispatcher().syncDispatch(()-{textComponent.setText(处理完成: data);});}}代码速查卡API功能示例getGlobalTaskDispatcher()获取全局并发分发器getGlobalTaskDispatcher(TaskPriority.DEFAULT)createParallelTaskDispatcher()创建并行分发器createParallelTaskDispatcher(name, priority)createSerialTaskDispatcher()创建串行分发器createSerialTaskDispatcher(name, priority)getUITaskDispatcher()获取 UI 线程分发器getUITaskDispatcher()asyncDispatch()异步派发任务dispatcher.asyncDispatch(runnable)syncDispatch()同步派发任务阻塞等待dispatcher.syncDispatch(runnable)delayDispatch()延迟派发任务dispatcher.delayDispatch(runnable, 1000)asyncGroupDispatch()添加任务到任务组dispatcher.asyncGroupDispatch(group, task)groupDispatchNotify()任务组完成后回调dispatcher.groupDispatchNotify(group, task)与 Android/iOS 对比特性HarmonyOSAndroidiOS线程模型TaskDispatcher 分发机制Handler Looper MessageQueueGCDGrand Central DispatchUI 线程更新UITaskDispatcherrunOnUiThread()/View.post()DispatchQueue.main.async线程间通信EventHandlerHandler / LiveData / FlowNotificationCenter / Delegate任务优先级HIGH / DEFAULT / LOWTHREAD_PRIORITY_*常量QOS_CLASS_*质量服务等级生命周期跟 Ability 绑定跟 Activity/Process 绑定跟进程生命周期绑定⚠️ 踩坑回忆录为什么我的 UI 卡死了有一次我在主线程里执行了一个 3 秒的网络请求结果整个界面像冻住了一样——用户疯狂点击毫无响应系统甚至弹出了 ANR 对话框。后来才明白HarmonyOS 的主线程就是 UI 线程任何耗时操作都必须丢到后台线程。我把网络请求移到GlobalTaskDispatcher.asyncDispatch()里世界瞬间清静了。还有一个容易犯的错TaskDispatcher不是 Java 标准线程池它的生命周期跟 Ability 绑定Ability 销毁后分发器也会失效。如果你在onStop里启动了一个延时任务等任务执行时 Ability 可能已经不存在了。解决方案是在任务执行前检查 Ability 状态或使用EventRunner创建独立生命周期的线程。必做实操任务序号任务难度1使用 GlobalTaskDispatcher 执行模拟耗时任务Random sleep观察并发执行效果中2使用 SerialTaskDispatcher 实现任务组验证 task3 在 task1/task2 之后执行中3使用 EventHandler 实现主线程与子线程的数据传递更新 UI 文本高4实现一个简单的图片下载器后台线程下载 UI 线程显示高5对比 syncDispatch 和 asyncDispatch 的行为差异低学习检查清单能说出四种 TaskDispatcher 的区别和适用场景能使用 GlobalTaskDispatcher 在后台线程执行耗时操作能使用 UITaskDispatcher 在主线程更新 UI能使用 TaskGroup 实现多任务同步等待能使用 EventHandler 实现线程间通信理解 TaskDispatcher 生命周期与 Ability 的绑定关系能说出 HIGH / DEFAULT / LOW 三种优先级的区别知道为什么不能在主线程执行网络/IO 操作进阶方向研究线程池调优策略根据 CPU 核心数动态调整并发度学习 Reactive Programming响应式编程思想在 HarmonyOS 中的应用探索分布式场景下的跨设备任务调度定关系能说出 HIGH / DEFAULT / LOW 三种优先级的区别知道为什么不能在主线程执行网络/IO 操作进阶方向研究线程池调优策略根据 CPU 核心数动态调整并发度学习 Reactive Programming响应式编程思想在 HarmonyOS 中的应用探索分布式场景下的跨设备任务调度