当前位置: 首页 > news >正文

Java Callback 实现线程切换以及与Kotlin原理关系

案例

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;// 1. 定义回调接口
public interface ThreadSwitchCallback {void onSuccess(String result);    // 成功回调void onFailure(Exception error); // 失败回调void onProgress(int progress);   // 进度更新回调
}// 2. 模拟耗时任务执行器
public class AsyncTaskExecutor {private final ExecutorService threadPool = Executors.newFixedThreadPool(2);// 3. 执行异步任务(接受回调参数)public void executeTask(final String input, final ThreadSwitchCallback callback) {threadPool.execute(() -> {try {// 在工作线程执行耗时操作for (int i = 0; i <= 100; i += 10) {Thread.sleep(200); // 模拟工作callback.onProgress(i); // 进度更新回调}// 模拟处理结果String result = "Processed: " + input.toUpperCase();// 4. 切换到主线程(UI线程)回调结果switchToMainThread(() -> callback.onSuccess(result));} catch (Exception e) {// 5. 错误处理(切换到主线程)switchToMainThread(() -> callback.onFailure(e));}});}// 6. 模拟切换到主线程的方法private void switchToMainThread(Runnable action) {// 在实际Android中应使用 new Handler(Looper.getMainLooper()).post(action)// 这里使用简单模拟new Thread(() -> {try {Thread.sleep(50); // 模拟线程切换延迟System.out.println("【切换到主线程】");action.run();} catch (InterruptedException e) {e.printStackTrace();}}).start();}
}// 7. 主程序(模拟Android UI线程)
public class CallbackDemo {public static void main(String[] args) {System.out.println("【主线程】启动 - " + Thread.currentThread().getName());AsyncTaskExecutor executor = new AsyncTaskExecutor();// 8. 创建回调实现ThreadSwitchCallback callback = new ThreadSwitchCallback() {@Overridepublic void onSuccess(String result) {System.out.println("【回调结果】" + result + " - 线程: " + Thread.currentThread().getName());}@Overridepublic void onFailure(Exception error) {System.err.println("【回调错误】" + error.getMessage());}@Overridepublic void onProgress(int progress) {System.out.println("【进度更新】" + progress + "% - 线程: " + Thread.currentThread().getName());}};// 9. 执行异步任务System.out.println("【主线程】启动异步任务");executor.executeTask("Hello Callback", callback);// 10. 主线程继续执行其他任务System.out.println("【主线程】继续执行其他任务...");// 保持程序运行(模拟Android生命周期)try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}}
}

运行结果示例

【主线程】启动 - main
【主线程】启动异步任务
【主线程】继续执行其他任务...
【进度更新】0% - 线程: Thread-0
【进度更新】10% - 线程: Thread-0
【进度更新】20% - 线程: Thread-0
【进度更新】30% - 线程: Thread-0
【进度更新】40% - 线程: Thread-0
【进度更新】50% - 线程: Thread-0
【进度更新】60% - 线程: Thread-0
【进度更新】70% - 线程: Thread-0
【进度更新】80% - 线程: Thread-0
【进度更新】90% - 线程: Thread-0
【进度更新】100% - 线程: Thread-0
【切换到主线程】
【回调结果】Processed: HELLO CALLBACK - 线程: Thread-1

核心机制解析

1. 回调接口定义
public interface ThreadSwitchCallback {void onSuccess(String result);void onFailure(Exception error);void onProgress(int progress);
}
  • 定义线程切换后需要执行的操作

  • 包含成功、失败、进度更新三种回调类型

2. 线程切换关键实现
private void switchToMainThread(Runnable action) {new Thread(() -> {Thread.sleep(50); // 模拟线程切换延迟System.out.println("【切换到主线程】");action.run(); // 在主线程执行回调}).start();
}

回调机制的优缺点

优点:

  1. 明确的异步操作分离

  2. 支持多状态回调(成功/失败/进度)

  3. 兼容各种 Java 版本

  4. 线程切换逻辑清晰可见

缺点:

  1. 嵌套回调导致"金字塔"代码结构

  2. 错误处理分散在不同回调中

  3. 需要手动管理线程切换

  4. 回调接口定义繁琐(需创建多个接口)

与 Kotlin 协程对比

特性Java 回调Kotlin 协程
代码结构嵌套回调线性同步风格
线程切换手动使用 Handler自动通过 Dispatchers
错误处理分散在各回调集中 try-catch
并发控制需手动同步async/await 简化
内存开销多个回调对象共享状态机
学习曲线简单直接概念较复杂

关键区别:协程本质上也是基于回调机制,但通过编译器将回调转换为状态机,使代码保持线性结构。回调是显式线程切换,协程是隐式线程切换。

http://www.dtcms.com/a/322569.html

相关文章:

  • MySQL(188)如何使用MySQL的慢查询工具?
  • 驾驶场景玩手机识别准确率↑32%:陌讯动态特征融合算法实战解析
  • 用生活日常的案例来介绍“程序运行时,对函数的调用一般有两种形式:传值调用和引用调用 和 这两种调用有什么区别?
  • 使用Navicat备份数据库MySQL、PostGreSQL等
  • SqlSugar vs EF Core 对比 2025年 .NET ORM
  • ES6中箭头函数的作用
  • C++-红黑树
  • 电子电气架构 --- 48伏电气系统架构
  • 串扰-信号完整性与电源完整性分析
  • C++安全异常设计
  • 浅尝AI辅助C转Verilog方法
  • 阿里云 ECS 怎么用 nginx 部署80端口多个网站
  • 无印良品:回归本质的管理哲学
  • 海康威视摄像头实时推流到阿里云公网服务器(Windows + FFmpeg + nginx-rtmp)
  • webrtc弱网-BandwidthQualityScaler 源码分析与算法原理
  • Ruoyi-Vue-Plus 修改包名、模块名、项目名
  • MySQL 临时表详细说明
  • 20.万物皆可变身术:状态模式架构全景解析
  • 【Git】Visual Studio 实现合并分支
  • 在 Ubuntu 中测试串口通信:详细指南与实践
  • 【面试场景题】微博热点新闻系统设计方案
  • 容器docker场景下新增接口测试及工具使用方法介绍
  • 人工智能技术发展历史演变
  • Java基础-TCP通信(多发多收和一发一收)
  • 八、Linux Shell 脚本:变量与字符串
  • Dotenv 入门教程
  • 政府数字化大屏系统 - Flask实现方案
  • 上海AI Lab、浙大EagleLab等提出RRVF:利用「验证非对称性」,只输入图片学习视觉推理
  • 接口文档深入解析
  • OpenAI开源大模型 GPT-OSS 开放权重语言模型解析:技术特性、部署应用及产业影响