CompletableFuture的入门
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的入门的更多相关文章
- CompletableFuture用法介绍
		一.CompletableFuture用法入门介绍 入门介绍的一个例子: package com.cy.java8; import java.util.Random; import java.util ... 
- 一条数据的HBase之旅,简明HBase入门教程-Write全流程
		如果将上篇内容理解为一个冗长的"铺垫",那么,从本文开始,剧情才开始正式展开.本文基于提供的样例数据,介绍了写数据的接口,RowKey定义,数据在客户端的组装,数据路由,打包分发, ... 
- Spring Reactor 入门与实践
		适合阅读的人群:本文适合对 Spring.Netty 等框架,以及 Java 8 的 Lambda.Stream 等特性有基本认识,希望了解 Spring 5 的反应式编程特性的技术人员阅读. 一.前 ... 
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
		上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ... 
- ABP入门系列(1)——学习Abp框架之实操演练
		作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ... 
- Oracle分析函数入门
		一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ... 
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
		上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ... 
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
		上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ... 
- Angular2入门系列教程4-服务
		上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ... 
随机推荐
- 介绍关于MSSQL当前行中获取到上一行某列值的函数 Coalesce
			记录一个小知识点,在SQLGrid中,在当前行显示上一行某列值的函数** Coalesce **的使用. 显示上一行是有啥子用? 经常有人百度SQL上一行减下一行的写法,但是没几个文章是用最简单直接的 ... 
- 共读《redis设计与实现》-单机(一)
			上一章我们讲了 redis 基本类型的数据结构 和 对象系统 ,这篇来说一下单机redis 的知识点. 一.数据库 一个数据库在redis中就有一个结构体,而数据库的结构体是由redisServer这 ... 
- Dom基础(一):attribute和properrty的区别
			properrty:修改对象属性不会体现到html结构中,针对DOM节点自带属性(id,className,style) attribute:修改html属性,会改变html结构,大多可以添加自定义属 ... 
- VulnHub-Earth 打靶记录
			目录 VulnHub-Earth 打靶记录 知识点 目标探测 信息收集 Shell反弹&信息二次收集 提权 权限维持 VulnHub-Earth 打靶记录 搭建靶场的时候一定要使用NATser ... 
- 设置 Visual Studio 总是以管理员身份运行
			话不多说直接上干货 第一步: 打开 Visual Studio 的安装目录,找到 devenv.exe,然后右键快捷菜单选择"兼容性疑难解答". 第二步: 选择故障排查选项 疑难解 ... 
- CNN-Backbone的Pytorch实现
			创建日期: 2020-07-04 17:19:39 简介:卷积神经网络非常适合处理图像相关任务,其优势一是权值共享策略,降低了模型复杂度和参数量,本质上也对应着生物视觉神经的感受野.二是其强大的特征提 ... 
- 面试题|Docker的优缺点
			开源Linux 长按二维码加关注~ 上一篇:Linux中几个正则表达式的用法 Docker解决的问题: 由于不同的机器有不同的操作系统,以及不同的库和组件,在将一个应用部署到多台机器上需要进行大量的环 ... 
- java实现空心金字塔
			前言 最近在学习java,遇到了一个经典打印题目,空心金字塔,初学者记录,根据网上教程,有一句话感觉很好,就是先把麻烦的问题转换成很多的简单问题,最后一一解决就可以了,然后先死后活,先把程序写死,后面 ... 
- Mysql数据库基础_复习思维导图
			Mysql复习的一个小总结,用xmind写的.(字数没有都不给我发博客) 下面是一些备注 子查询 MySQL子查询称为内部查询,而包含子查询的查询称为外部查询. 子查询可以在使用表达式的任何地方使用, ... 
- 基于C++11的线程池实现
			1.线程池 1.1 线程池是什么? 一种线程管理方式. 1.2 为什么用线程池? 线程的创建和销毁都需要消耗系统开销,当线程数量过多,系统开销过大,就会影响缓存局部性和整体性能.而线程池能够在充分利用 ... 
