再遇 CompletableFuture

博客讨论了在重构项目中使用CompletableFuture时遇到的问题,即在main方法中测试无输出。原因是CompletableFuture默认使用守护线程,导致主线程结束时未完成的任务被终止。解决方法包括让主线程等待或使用CompletableFuture的join方法。这提醒开发者在使用并发工具时要考虑线程生命周期和控制流程。

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

对于项目重构来说,应遵循能不动的代码尽量不要动的基本原则(☺_☺)

当然如果时间允许的话,能优化的最好,这不把以前用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 方法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值