runAsync 和 supplyAsync

runAsync接受一个Runable的实现,无返回值

CompletableFuture.runAsync(()->System.out.println("无返回结果的运行"));

supplyAsync接受一个Supplier的实现,有返回值

CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
System.out.println("有返回结果的运行");
return 1;
});

获取结果的get和join

都是堵塞,直到返回结果

get方法抛出是经过处理的异常,ExecutionException或**InterruptedException **,需要用户手动捕获

try {
System.out.println(CompletableFuture.supplyAsync(() -> {
System.out.println("有返回结果的运行");
return 1;
}).get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}

join方法抛出的就不用捕获,是经过包装的**CompletionException **或 CancellationException

        System.out.println(CompletableFuture.supplyAsync(() -> {
try {
TimeUnit.MILLISECONDS.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("有返回结果的运行");
return 1;
}).join());

常用方法

获取结果的get\join\getNow

get():一直等待

get(timeout,unit):等待,除非超时

getNow(valueIfAbsent):计算完返回计算的结果,未计算完返回默认的结果

CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {

            try {
TimeUnit.SECONDS.sleep(1);
;
} catch (InterruptedException e) {
e.printStackTrace();
}
return 1;
}); System.out.println("立即获取:"+completableFuture.getNow(9999));
try {
TimeUnit.SECONDS.sleep(2);
System.out.println("doing");
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("等一会获取:"+completableFuture.getNow(9999));

join() 同get()

thenApply\handle

执行完前面的,前面返回的结果返回,然后传给后面再,执行完后面任务,一步一步来。

CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
System.out.println("step 1");
return 1;
}).thenApply(a -> {
System.out.println("step 2");
return a + 2;
}).thenApply(a -> {
System.out.println("step 3");
return a + 3;
});
System.out.println(completableFuture.get());

执行结果:

CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
System.out.println("step 1");
int a=1/0;
return 1;
}).handle((a,b) -> {
System.out.println("step 2");
if (b!=null) {
System.out.println(b.getMessage());
return 0;
}
return a + 2;
}).handle((a,b) -> {
System.out.println("step 3");
if (b!=null) {
System.out.println(b.getMessage());
return 0;
}
return a + 3;
});
System.out.println(completableFuture.get());

执行结果:

thenApply和handle的区别:

thenApply执行的时候,有异常的则整个执行链会中断,直接抛出异常。



handle有异常也可以往下一步走,根据带的异常参数可以进一步处理

thenAccept

接收前面任务的返回结果,当前节点处理,并不返回结果。

CompletableFuture.supplyAsync(()->{
System.out.println("step 1");
return 10;
}).thenAccept(a->{
System.out.println("res "+a);
});

applyToEither

在多个任务段同时执行时,哪个任务段用时最少,就返回哪个

CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
System.out.println("step 1");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 1;
}).applyToEither(CompletableFuture.supplyAsync(() -> {
System.out.println("step 2");
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 2;
}), a -> {
return a;
});
System.out.println(completableFuture.get());

执行结果:

thenCombine

合并多个任务段的返回结果

CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
System.out.println("step 1");
return IntStream.range(1, 11).sum();
}).thenCombine(CompletableFuture.supplyAsync(() -> {
System.out.println("step 2");
return IntStream.range(11, 21).sum();
}), (a, b) -> a + b)
.thenCombine(CompletableFuture.supplyAsync(() -> {
System.out.println("step 3");
return IntStream.range(21, 31).sum();
}), (a, b) -> a + b);
System.out.println(completableFuture.get());

CompletableFuture的入门的更多相关文章

  1. CompletableFuture用法介绍

    一.CompletableFuture用法入门介绍 入门介绍的一个例子: package com.cy.java8; import java.util.Random; import java.util ...

  2. 一条数据的HBase之旅,简明HBase入门教程-Write全流程

    如果将上篇内容理解为一个冗长的"铺垫",那么,从本文开始,剧情才开始正式展开.本文基于提供的样例数据,介绍了写数据的接口,RowKey定义,数据在客户端的组装,数据路由,打包分发, ...

  3. Spring Reactor 入门与实践

    适合阅读的人群:本文适合对 Spring.Netty 等框架,以及 Java 8 的 Lambda.Stream 等特性有基本认识,希望了解 Spring 5 的反应式编程特性的技术人员阅读. 一.前 ...

  4. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  5. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  6. Oracle分析函数入门

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  7. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  8. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  9. Angular2入门系列教程4-服务

    上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...

随机推荐

  1. 让视障者的网络之路少一些障碍——微软为 Edge 浏览器开发自动图像描述功能并呼吁网页作者补充图片的替换说明

    网页是互联网的组成部分,浏览器是开启互联网大门的钥匙.对于生活在信息时代下的我们而言,每一个人都很难离开网络而生活,其中也包括盲人这一残障群体. 本文的引子是如下一条新闻: IT之家3月18日消息,微 ...

  2. node.js -- 身份认证

    请问昨天结束的早是对堆积在了今天吗,今天还来加个班更博,看在这个毅力的份上能否给亿点点推荐. 有个好消息有个坏消息,先说坏消息吧,就是在这么学下去我急需急支糖浆,来回顾回顾前面的知识,这几天学的太急了 ...

  3. Linux网络流量相关

    一直以来对Linux网络这块都感觉比较乱 遇到一个UDP丢包的问题:在测试中,一台VM虚拟机,CPU利用率55%左右,内存利用率7%左右,网卡流量也远没到限制的时候出现了丢包情况 使用netstat ...

  4. 【链表】【leetCode高频】: 19. 删除链表的倒数第 N 个结点

    1.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 2.算法分析 知识补充: . 分析: 题目要求是删除链表中倒数第N个结点.可以使用两个指针slow,fast. 重点是 ...

  5. IX交换中心网络架构分析

    拓扑如上 IX功能介绍 IX交换中心,客户接入交换中心只收取端口费用,在交换中心网内的流量不收取任何费用,一个交换中心是否值得接入主要看该ix所接入的用户 假如客户A是做视频网站,用的视频源是IQY的 ...

  6. layui数据表格搜索

    简单介绍 我是通过Servlet传递json给layui数据表格模块,实现遍历操作的,不过数据量大的话还是需要搜索功能的.这是我参考网上大佬代码写出的搜索功能. 实现原理 要实现搜索功能,肯定需要链接 ...

  7. 个人冲刺(六)——体温上报app(一阶段)

    任务:完成了自动获取定位信息以及自动获取时间功能 自动获取定位信息 public void onReceiveLocation(BDLocation location){ //此处的BDLocatio ...

  8. 一文学完Linux常用命令

    一.Linux 终端命令格式 1.终端命令格式 完整版参考链接:Linux常用命令完整版 command [-options] [parameter] 说明: command : 命令名,相应功能的英 ...

  9. python将test01文件夹中的文件剪切到test02文件夹中

    将test01文件夹中的文件剪切到test02文件夹中 import shutil import os def remove_file(old_path, new_path): print(old_p ...

  10. KMP算法(改进的模式匹配算法)——next函数

    KMP算法简介 KMP算法是在基础的模式匹配算法的基础上进行改进得到的算法,改进之处在于:每当匹配过程中出现相比较的字符不相等时,不需要回退主串的字符位置指针,而是利用已经得到的部分匹配结果将模式串向 ...