对于项目重构来说,应遵循能不动的代码尽量不要动的基本原则(☺_☺)
当然如果时间允许的话,能优化的最好,这不把以前用Future的地方改用CompletableFuture。
废话不多说,改完后测试问题:
|
前提:在main函数内测试 问题:控制台无任何输出语句 |
代码:
public static void completableFutureDemo() {
for (int i = 0; i < 3; i++) {
CompletableFuture.supplyAsync(() -> {
// 模拟查询数据操作
String name = Thread.currentThread().getName();
System.out.println("当前线程名:" + name + "时间:" + LocalDateTime.now().toString());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
System.out.println(name+"线程异常,,,");
e.printStackTrace();
}
return name;
}).whenComplete((name, throwable) -> {
// 模拟封装 查询出来的数据 操作
System.out.println(name + "线程执行完了," + "时间:" + LocalDateTime.now().toString());
});
}
}
原因:
CompletableFuture开启的是 守护线程,也就是说主线程执行完毕就结束啦,其他守护线程自动退出; 所以这个方法在main中测试不会有任何输出的;在生产环境是 因为主线程 都是一直开着的,所以有结果,是没有问题的。
测试解决办法:
1)在主线程(main)中开启一个 非守护线程 一直阻塞着(例如:Thread.sleep(10000);) 2)在completableFutureDemo方法 最后 使用CompletableFuture 的 join 方法
博客讨论了在重构项目中使用CompletableFuture时遇到的问题,即在main方法中测试无输出。原因是CompletableFuture默认使用守护线程,导致主线程结束时未完成的任务被终止。解决方法包括让主线程等待或使用CompletableFuture的join方法。这提醒开发者在使用并发工具时要考虑线程生命周期和控制流程。
3565

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



