对于项目重构来说,应遵循能不动的代码尽量不要动的基本原则(☺_☺)
当然如果时间允许的话,能优化的最好,这不把以前用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 方法