Java CompletableFuture的complete(7)

简介: Java CompletableFuture的complete(7)先看代码: CompletableFuture future = CompletableFuture.

Java CompletableFuture的complete(7)


先看代码:

        CompletableFuture<String> future = CompletableFuture.supplyAsync(new Supplier<String>() {
            @Override
            public String get() {
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (Exception e) {
                    e.printStackTrace();
                }

                return "blog.csdn.net/zhangphil";
            }
        });

        System.out.println(System.currentTimeMillis() + ":time 1");

        future.whenCompleteAsync(new BiConsumer<String, Throwable>() {
            @Override
            public void accept(String s, Throwable throwable) {
                System.out.println(System.currentTimeMillis() + ":" + s);
            }
        });

        System.out.println(System.currentTimeMillis() + ":time 2");

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    TimeUnit.SECONDS.sleep(3);
                } catch (Exception e) {
                    //异常退出。
                    future.completeExceptionally(e);
                }

                // CompletableFuture被通知线程任务完成。
                System.out.println(System.currentTimeMillis() + ":运行至此。");
                future.complete("任务完成。");
            }
        }).start();

        System.out.println(System.currentTimeMillis() + ":time 3");

输出:

06-19 11:25:17.630 15068-15068/zhangphil.test I/System.out: 1529378717630:time 1
06-19 11:25:17.631 15068-15068/zhangphil.test I/System.out: 1529378717631:time 2
    1529378717631:time 3
06-19 11:25:19.638 15068-15094/zhangphil.test I/System.out: 1529378719638:blog.csdn.net/zhangphil
06-19 11:25:20.634 15068-15095/zhangphil.test I/System.out: 1529378720633:运行至此。

可以看到在Thread线程体中的

future.complete("任务完成。");

没有执行,是因为在CompletableFuture.supplyAsync只休息了两秒,就正常执行完毕了,故不再执行complete的代码了。complete用来告知CompletableFuture任务完成。

下面调换sleep时间,让CompletableFuture.supplyAsync休息的长一些,而Thread里面休息短一下:

        CompletableFuture<String> future = CompletableFuture.supplyAsync(new Supplier<String>() {
            @Override
            public String get() {
                try {
                    TimeUnit.SECONDS.sleep(3);
                } catch (Exception e) {
                    e.printStackTrace();
                }

                return "blog.csdn.net/zhangphil";
            }
        });

        System.out.println(System.currentTimeMillis() + ":time 1");

        future.whenCompleteAsync(new BiConsumer<String, Throwable>() {
            @Override
            public void accept(String s, Throwable throwable) {
                System.out.println(System.currentTimeMillis() + ":" + s);
            }
        });

        System.out.println(System.currentTimeMillis() + ":time 2");

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (Exception e) {
                    //异常退出。
                    future.completeExceptionally(e);
                }

                // CompletableFuture被通知线程任务完成。
                System.out.println(System.currentTimeMillis() + ":运行至此。");
                future.complete("任务完成。");
            }
        }).start();

        System.out.println(System.currentTimeMillis() + ":time 3");

输出:

06-19 11:32:26.814 16768-16768/zhangphil.test I/System.out: 1529379146814:time 1
06-19 11:32:26.815 16768-16768/zhangphil.test I/System.out: 1529379146815:time 2
06-19 11:32:26.816 16768-16768/zhangphil.test I/System.out: 1529379146816:time 3
06-19 11:32:28.818 16768-16820/zhangphil.test I/System.out: 1529379148818:运行至此。
06-19 11:32:28.822 16768-16854/zhangphil.test I/System.out: 1529379148822:任务完成。

这次没有输出字符串blog.csdn.net/zhangphil了,因为Thread率先执行完成,则直接以complete的结果为准,忽略CompletableFuture.supplyAsync的get计算结果。


相关文章
|
5天前
|
消息中间件 缓存 NoSQL
Java多线程实战-CompletableFuture异步编程优化查询接口响应速度
Java多线程实战-CompletableFuture异步编程优化查询接口响应速度
|
14天前
|
Java API 数据库
深研Java异步编程:CompletableFuture与反应式编程范式的融合实践
【4月更文挑战第17天】本文探讨了Java中的CompletableFuture和反应式编程在提升异步编程体验上的作用。CompletableFuture作为Java 8引入的Future扩展,提供了一套流畅的链式API,简化异步操作,如示例所示的非阻塞数据库查询。反应式编程则关注数据流和变化传播,通过Reactor等框架实现高度响应的异步处理。两者结合,如将CompletableFuture转换为Mono或Flux,可以兼顾灵活性和资源管理,适应现代高并发环境的需求。开发者可按需选择和整合这两种技术,优化系统性能和响应能力。
|
21天前
|
Java API
java多线程之FutureTask、Future、CompletableFuture
java多线程之FutureTask、Future、CompletableFuture
|
3月前
|
前端开发 Java API
Java并发基础:CompletableFuture全面解析
CompletableFuture类使得并发任务的处理变得简单而高效,通过简洁的API,开发者能轻松创建、组合和链式调用异步操作,无需关心底层线程管理,这不仅提升了程序的响应速度,还优化了资源利用率,让复杂的并发逻辑变得易于掌控。
Java并发基础:CompletableFuture全面解析
|
3月前
|
Java
深入理解 Java 异步编程:Future 和 CompletableFuture 的全面比较
深入理解 Java 异步编程:Future 和 CompletableFuture 的全面比较
40 0
|
4月前
|
前端开发 JavaScript Java
每日一博 - Java 异步编程的 Promise 模式 CompletableFuture的前世今生 (上)
每日一博 - Java 异步编程的 Promise 模式 CompletableFuture的前世今生 (上)
68 0
每日一博 - Java 异步编程的 Promise 模式 CompletableFuture的前世今生 (上)
|
6月前
|
Java 测试技术
Java8 异步非阻塞做法:CompletableFuture 两万字详解
CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者的一个扩展,增加了异步回调、流式处理、多个Future组合处理的能力,使Java在处理多任务的协同工作时更加顺畅便利
Java 8 的异步利器:CompletableFuture源码解析(建议精读)
实现了俩接口,本身是个class。这个是Future的实现类,使用 completionStage 接口去支持完成时触发的函数和操作。
|
10月前
|
Java
Java异步编程CompletableFuture
Java异步编程CompletableFuture
|
10月前
|
存储 SpringCloudAlibaba Java
Java新特性:异步编排CompletableFuture
CompletableFuture由Java 8提供,是实现异步化的工具类,上手难度较低,且功能强大,支持通过函数式编程的方式对各类操作进行组合编排。 CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者的一个扩展,增加了异步[回调](https://so.csdn.net/so/search?q=回调&spm=1001.2101.3001.7020)、流式处理、多个Future组合处理的能力,使Java在处理多任务的协同工作时更加顺畅便利。
172 1
Java新特性:异步编排CompletableFuture