java callback recall

本文介绍了一个基于Java的多线程任务分配与执行框架。该框架通过一个Boss类来启动多个Worker线程,每个Worker线程独立完成任务并向Boss报告结果。此设计展示了如何在Java中实现简单的多线程任务管理系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


package net;

import java.util.ArrayList;
import java.util.List;

public class FZ {
public static void main(String[] args) {
System.out.println("----------------");
Boss boss = new Boss();
boss.startWork();

}
}

interface Rule {
public void reportResult(String data);
}

class Boss implements Rule {
private List<Worker> workers = new ArrayList<Worker>();

public void startWork() {
for (int i = 0; i < 10; i++) {
Worker worker = new Worker(this);
workers.add(worker);
worker.start();
}
}

@Override
public void reportResult(String result) {
// TODO Auto-generated method stub
System.out.println(result + " done!");
}

}

class Worker extends Thread {
private Rule rule;

public Worker(Rule rule) {
this.rule = rule;
}

public void doWork() {
// TODO cost much time
for (int i = 0; i < 100; i++) {
System.err.println("worker" + Thread.currentThread().getId()
+ " => do " + i);
}
rule.reportResult("worker" + Thread.currentThread().getId());
}

@Override
public void run() {
doWork();
}

}
### Java 中的回调机制及其使用 #### 什么是回调机制? 在编程中,回调是一种设计模式,在这种模式下,函数 A 将另一个函数 B 作为参数传递给某个方法或类,并允许该方法或类在其内部调用这个传入的函数 B。这种方式使得程序可以更加灵活地处理异步操作或者事件驱动的行为。 Java 提供了多种方式来实现回调机制,其中最常见的是通过接口和匿名内部类的方式[^1]。 --- #### 使用接口实现回调的例子 下面是一个简单的例子展示如何利用接口定义并实现回调: ```java // 定义一个回调接口 public interface Callback { void onResult(String result); } // 创建一个需要执行回调逻辑的类 public class TaskExecutor { public void executeTask(Callback callback) { // 模拟一些耗时的任务 try { Thread.sleep(2000); // 延迟两秒模拟任务完成时间 } catch (InterruptedException e) { e.printStackTrace(); } String taskResult = "Task Completed Successfully!"; System.out.println("Executing task..."); callback.onResult(taskResult); // 调用回调方法通知结果 } } ``` 接着可以通过如下代码片段测试上述 `TaskExecutor` 类的功能: ```java public class MainApp { public static void main(String[] args) { TaskExecutor executor = new TaskExecutor(); // 实现回调接口并通过匿名内部类实例化它 executor.executeTask(new Callback() { @Override public void onResult(String result) { System.out.println("Callback received: " + result); } }); } } ``` 运行此应用程序将会打印出两条消息,一条表示正在执行任务,另一条则显示由回调触发的结果信息[^2]。 --- #### Lambda 表达式的引入简化回调编写 自 Java 8 开始支持 lambda 表达式之后,我们可以进一步优化上面提到的传统做法。对于同样的功能需求,现在可以用更简洁的形式表达出来: ```java executor.executeTask(result -> System.out.println("Lambda Callback Received: " + result)); ``` 这里我们不再显式创建一个新的对象去继承抽象基类或是实现特定接口;而是直接采用箭头语法书写行为描述即可[^3]。 --- #### 回调的实际应用场景之一——数据库交互 当涉及到像 SQLite 数据库这样的外部资源访问时,通常也需要考虑线程安全以及非阻塞的操作流程。假设我们要查询某些数据记录并将它们返回到 UI 层更新界面状态,则可能需要用到类似的回调结构帮助协调不同组件之间的通信过程[^4]。 首先确保已经正确配置好 JDBC 驱动环境,可以从指定位置下载适合版本号的 JAR 文件: ```bash wget https://bitbucket.org/xerial/sqlite-jdbc/downloads/sqlite-jdbc-3.36.0.3.jar ``` 然后按照常规步骤加载驱动器、建立连接池管理工具等等准备工作完成后就可以着手构建具体的业务逻辑模块啦! 以下是关于如何设置基本 SQL 查询语句加上简单错误捕捉机制的一个示范案例: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class DatabaseHandler { private Connection conn; public DatabaseHandler(String dbPath){ try{ this.conn = DriverManager.getConnection("jdbc:sqlite:" + dbPath); }catch(Exception ex){ throw new RuntimeException(ex.getMessage()); } } public void fetchDataAsync(final Callback<String> callback){ new Thread(() -> { Statement stmt = null; ResultSet rs = null; try{ stmt = conn.createStatement(); rs = stmt.executeQuery("SELECT * FROM users LIMIT 1;"); StringBuilder sb = new StringBuilder(); while(rs.next()){ sb.append(rs.getString("name")).append("\n"); } callback.onResult(sb.toString()); }catch(Throwable t){ callback.onResult(t.getMessage()); }finally{ closeResources(stmt,rs); } }).start(); } private void closeResources(AutoCloseable... resources){ for(var res : resources){ if(res !=null ){ try{res.close();}catch(Exception ignored){} } } } } ``` 在这个场景里,每当有新的请求到来都会开启独立的工作单元负责单独的数据检索工作而不会影响主线程正常运转节奏。一旦获取到了预期的内容就立即告知监听者以便及时作出响应动作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值