在开发中会碰到一种场景,如下

Object result1 = service1.func1();//执行80ms
Object result2 =service2.func2();//执行50ms service3.func3(result1,result2);

func3()需要等待func1和func2的执行结果。总共需要等待130ms.如果能够让func1和func2同时执行,那么最少的等待时间将会是80ms.

下面使用CompletableFuture来实现。

JDK1.8才新加入的一个实现类CompletableFuture,实现了Future<T>CompletionStage<T>两个接口。

定义任务类

这里定义了一个方法findUser,它的返回值是CompletableFuture<String>,用来模拟远程调用。

当执行结果是正常时,通过

public boolean complete(T value)

返回结果。

当执行异常时,如果想向调用者返回异常,通过

public boolean completeExceptionally(Throwable ex)

返回异常。

class TaskService{

    public  CompletableFuture<String> findUser(){
CompletableFuture<String> future = new CompletableFuture();
     //模仿远程调用线程
new Thread(){ @Override
public void run() { String result = null;
System.out.println("任务开始执行....");
try{
Thread.sleep(3000);
//模仿RPC远程调用
result = rpcRequest(true); System.out.println("任务执行结束...."); }
catch(Exception ex){
future.completeExceptionally(ex);
}
future.complete(result);
}
}.start();
     直接返回future.
return future;
} /**
*功能描述
* @author lgj
* @Description 模仿RPC远程调用
* @date 4/29/19
* @param: flag   true:返回正常结果 false:抛出异常
*    
* @return:
*
*/
public String rpcRequest(boolean flag){
String result = null;
if(flag){
result = "libai";
}
else {
throw new NullPointerException();
}
return result;
} }     

主线程调用

public class CompletableFutureDemo {

    public static void main(String args[]){

        TaskService service = new TaskService();

        CompletableFuture<String> future = service.findUser();

        future.whenComplete((t,u)->{

            if(u != null){
System.out.println("异步调用发生异常:" + u);
}
else {
System.out.println("异步调用执行正常: " + t);
} }); System.out.println("主线程任务执行完毕"); }
}

主线程通过whenComplete来回调结果。这里需要通过lambada 表达式来获取结果

 public CompletableFuture<T> whenComplete(
BiConsumer<? super T, ? super Throwable> action) {
return uniWhenCompleteStage(null, action);
}

当结果正常时

任务开始执行....
主线程任务执行完毕
任务执行结束....
异步调用执行正常: libai

当调用发生异常时

任务开始执行....
主线程任务执行完毕
异步调用发生异常:java.lang.NullPointerException

以上,便实现了异步调用。

目前,dubbo-2.7.0+便是使用CompletableFuture来实现rpc异步调用。

使用CompletableFuture实现异步编程的更多相关文章

  1. 从CompletableFuture到异步编程设计

    从CompletableFuture到异步编程设计,笔者就分为2部分来分享CompletableFuture异步编程设计,前半部分总结下CompletableFuture使用实践,后半部分分享下Com ...

  2. Java 8 (10) CompletableFuture:组合式异步编程

    随着多核处理器的出现,提升应用程序的处理速度最有效的方式就是可以编写出发挥多核能力的软件,我们已经可以通过切分大型的任务,让每个子任务并行运行,使用线程的方式,分支/合并框架(java 7) 和并行流 ...

  3. 异步编程CompletableFuture实现高并发系统优化之请求合并

    先说场景: 根据Redis官网介绍,单机版Redis的读写性能是12万/秒,批量处理可以达到70万/秒.不管是缓存或者是数据库,都有批量处理的功能.当我们的系统达到瓶颈的时候,我们考虑充分的压榨缓存和 ...

  4. Java8函数之旅 (八) - 组合式异步编程

    前言 随着多核处理器的出现,如何轻松高效的进行异步编程变得愈发重要,我们看看在java8之前,使用java语言完成异步编程有哪些方案. JAVA8之前的异步编程 继承Thead类,重写run方法 实现 ...

  5. 有了 CompletableFuture,使得异步编程没有那么难了!

    本文导读: 业务需求场景介绍 技术设计方案思考 Future 设计模式实战 CompletableFuture 模式实战 CompletableFuture 生产建议 CompletableFutur ...

  6. 编程老司机带你玩转 CompletableFuture 异步编程

    本文从实例出发,介绍 CompletableFuture 基本用法.不过讲的再多,不如亲自上手练习一下.所以建议各位小伙伴看完,上机练习一把,快速掌握 CompletableFuture. 个人博文地 ...

  7. 搞定 CompletableFuture,并发异步编程和编写串行程序还有什么区别?你们要的多图长文

    你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...

  8. 异步编程CompletableFuture

    多线程优化性能,串行操作并行化 串行操作 // 以下2个都是耗时操作 doBizA(); doBizB(); 修改变为并行化 new Thread(() -> doBizA()).start() ...

  9. 带你玩转CompletableFuture异步编程

    前言 最近在忙生活的第一个OKR,这个等等后面具体聊聊,今天开始恢复每周一篇原创,感谢小伙伴的不离不弃.这篇文章也是最近在Code Review的时候,看到的大家代码,想整体推下大家异步编程的思想,由 ...

随机推荐

  1. pymongo "ServerSelectionTimeoutError: No servers found yet" 错误的解决

    系统转移过程中,擅自把aptitude安装的mongoengine换成了pip安装,系统启动以后,报这个错误 报错提示: File "/usr/local/lib/python2.7/dis ...

  2. Wex5执行Class[search.login__do] Method[login]失败

    ====================开发工具版本:WeX5_V3.3======================== 报错背景:大二的时候用这个工具开发了一款APP,备份了项目数据库的SQL文件+ ...

  3. python3学习笔记3---引用http://python3-cookbook.readthedocs.io/zh_CN/latest/

    2018-03-01数据结构和算法(3) 1.11 命名切片 假定你有一段代码要从一个记录字符串中几个固定位置提取出特定的数据字段(比如文件或类似格式): ###### 012345678901234 ...

  4. Servlet总结二(文件路径)

    Servlet总结二(文件路径) 前言 前面我们说过ServletContext表示的是web容器中的上下文,下面我们也是用到ServletContext中的方法读取文件 读取WebRoot文件下的文 ...

  5. 深入理解javascript 匿名函数和闭包

    代码如下: (function(){ //这里忽略jQuery所有实现 })(); (function(){ //这里忽略jQuery所有实现 })();  半年前初次接触jQuery的时候,我也像其 ...

  6. Spring Cloud Config - RSA简介以及使用RSA加密配置文件

    简介 RSA非对称加密有着非常强大的安全性,HTTPS的SSL加密就是使用这种方法进行HTTPS请求加密传输的.因为RSA算法会涉及Private Key和Public Key分别用来加密和解密,所以 ...

  7. 读《图解HTTP》有感-(HTTP首部)

    写在前面 该章节是对请求报文及响应报文的首部信息进行解析.通过该章节的学习,相信大家对首部结构,及各个首部字段的作用有个基本的了解 正文 HTTP报文由HTTP报文首部.空行以及HTTP报文主体组成. ...

  8. 解决redis connection refused: connect无法连接redis

    环境 VM VirtualBox安装虚拟机CentOS 7 1.Redis.conf配置文件中 注释掉 bind 127.0.0.1 2.防火墙关闭(或添加可访问的端口,具体不在此描述) 最后一个坑 ...

  9. linux模块驱动之led(ioremap)

    一:led内核驱动 (1)在编写led内核驱动时,我们首先要进行内核裁剪,因为友善之臂将LED灯的驱动默认加载到内核中,所以编写模块驱动程序前就要先把原先的LED灯驱动裁剪掉: led驱动在源码里面的 ...

  10. 破解跳过QQ群验证--真实有效哦。

    说明:此教程可以实现强行加入别人的群,无需群主或管理员同意.来自于吾爱破解.跟着做了下,应该不用什么技术含量,因为啥也不懂的我也做到了最后.哈哈! 附上软件:https://pan.baidu.com ...