Mono
Mono(单细胞,单核),这里把它理解为单体即可,类似一张快递单,只定义,并不运行,运行交由管理器。
Mono示例
依赖:
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
<version>3.6.11</version>
</dependency>
代码:
import reactor.core.publisher.Mono;
import java.time.Duration;
public class MonoConcurrentDemo {
public static void main(String[] args) {
// 定义3个模拟耗时任务(模拟调用LLM/工具/数据库)
Mono<String> task1 = runTask("任务1-调用大模型", 2);
Mono<String> task2 = runTask("任务2-向量检索", 1);
Mono<String> task3 = runTask("任务3-联网工具查询", 3);
// 并发执行三个Mono,全部完成后统一收集结果
Mono<String[]> allTasks = Mono.zip(task1, task2, task3)
.map(tuple -> new String[]{tuple.getT1(), tuple.getT2(), tuple.getT3()});
System.out.println("===== 开始并发执行3个任务 =====");
// block() 主线程阻塞等待全部完成,main方法专用
String[] results = allTasks.block();
System.out.println("===== 所有任务执行完毕,汇总结果 =====");
for (String res : results) {
System.out.println(res);
}
}
/**
* 封装一个耗时Mono任务
* @param name 任务名称
* @param delay 模拟耗时秒数
* @return Mono单结果
*/
private static Mono<String> runTask(String name, long delay) {
return Mono.fromCallable(() -> {
System.out.printf("[%s] 开始执行,线程:%s%n", name, Thread.currentThread().getName());
// 模拟IO阻塞(模型调用、网络请求)
Thread.sleep(Duration.ofSeconds(delay).toMillis());
String result = String.format("[%s] 执行完成,耗时%d秒", name, delay);
System.out.printf("[%s] 结束,线程:%s%n", name, Thread.currentThread().getName());
return result;
})
// 设置超时,防止卡死
.timeout(Duration.ofSeconds(10))
// 异常兜底
.onErrorReturn(name + " 执行失败");
}
}

1653

被折叠的 条评论
为什么被折叠?



