就不介绍了,直接贴代码,建议在代码中使用,真的很方便

package cn.hou.completablefuture;

import org.junit.Test;

import java.util.concurrent.*;

public class CompletableFutureDemo {

    /**
* 在Java8中,CompletableFuture提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,
* 并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合 CompletableFuture 的方法
*
* 注意: 方法中有Async一般表示另起一个线程,没有表示用当前线程
*/
@Test
public void test01() throws Exception {
ExecutorService service = Executors.newFixedThreadPool();
/**
* supplyAsync用于有返回值的任务,
* runAsync则用于没有返回值的任务
* Executor参数可以手动指定线程池,否则默认ForkJoinPool.commonPool()系统级公共线程池
*/
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
TimeUnit.SECONDS.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
return "侯征";
}, service);
CompletableFuture<Void> data = CompletableFuture.runAsync(() -> System.out.println("侯征"));
/**
* 计算结果完成回调
*/
future.whenComplete((x,y)-> System.out.println(x+","+y)); //执行当前任务的线程执行继续执
data.whenCompleteAsync((x,y)-> System.out.println(x+","+y)); // 交给线程池另起线程执行
future.exceptionally(Throwable::toString);
//System.out.println(future.get());
/**
* thenApply,一个线程依赖另一个线程可以使用,出现异常不执行
*/
//第二个线程依赖第一个的结果
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> ).thenApply(x -> x); /**
* handle 是执行任务完成时对结果的处理,第一个出现异常继续执行
*/
CompletableFuture<Integer> future2 = future1.handleAsync((x, y) -> x + );
System.out.println(future2.get());//
/**
* thenAccept 消费处理结果,不返回
*/
future2.thenAccept(System.out::println);
/**
* thenRun 不关心任务的处理结果。只要上面的任务执行完成,就开始执行
*/
future2.thenRunAsync(()-> System.out.println("继续下一个任务"));
/**
* thenCombine 会把 两个 CompletionStage 的任务都执行完成后,两个任务的结果交给 thenCombine 来处理
*/
CompletableFuture<Integer> future3 = future1.thenCombine(future2, Integer::sum);
System.out.println(future3.get()); // 5+7=12
/**
* thenAcceptBoth : 当两个CompletionStage都执行完成后,把结果一块交给thenAcceptBoth来进行消耗
*/
future1.thenAcceptBothAsync(future2,(x,y)-> System.out.println(x+","+y)); //5,7
/**
* applyToEither
* 两个CompletionStage,谁执行返回的结果快,我就用那个CompletionStage的结果进行下一步的转化操作
*/
CompletableFuture<Integer> future4 = future1.applyToEither(future2, x -> x);
System.out.println(future4.get()); //
/**
* acceptEither
* 两个CompletionStage,谁执行返回的结果快,我就用那个CompletionStage的结果进行下一步的消耗操作
*/
future1.acceptEither(future2, System.out::println);
/**
* runAfterEither
* 两个CompletionStage,任何一个完成了都会执行下一步的操作(Runnable
*/
future1.runAfterEither(future,()-> System.out.println("有一个完成了,我继续"));
/**
* runAfterBoth
* 两个CompletionStage,都完成了计算才会执行下一步的操作(Runnable)
*/
future1.runAfterBoth(future,()-> System.out.println("都完成了,我继续"));
/**
* thenCompose 方法
* thenCompose 方法允许你对多个 CompletionStage 进行流水线操作,第一个操作完成时,将其结果作为参数传递给第二个操作
* thenApply是接受一个函数,thenCompose是接受一个future实例,更适合处理流操作
*/
future1.thenComposeAsync(x->CompletableFuture.supplyAsync(()->x+))
.thenComposeAsync(x->CompletableFuture.supplyAsync(()->x+))
.thenCompose(x->CompletableFuture.runAsync(()-> System.out.println("流操作结果:"+x)));
TimeUnit.SECONDS.sleep();//主线程sleep,等待其他线程执行
}
}

jdk8中CompletableFuture的各个API用法,极大扩展了Future的更多相关文章

  1. JDK8中的新时间API:Duration Period和ChronoUnit介绍

    目录 简介 Duration Period ChronoUnit 简介 在JDK8中,引入了三个非常有用的时间相关的API:Duration,Period和ChronoUnit. 他们都是用来对时间进 ...

  2. JDK8中新日期时间API

    它们面临的问题是:可变性:像日期和时间这样的类应该是不可变的.偏移性:Date中的年份是从1900开始的,而月份都从0开始.格式化:格式化只对Date有用,Calendar则不行.此外,它们也不是线程 ...

  3. Day029 JDK8中新日期和时间API (二)

    # JDK8中新日期和时间API (二) Instant介绍 Instant:时间线上的一个瞬时点. 这可能被用来记录应用程序中的事件时间 戳. 在处理时间和日期的时候,我们通常会想到年,月,日,时, ...

  4. Day029 JDK8中新日期和时间API (四)

    JDK8中新日期和时间API 其他的一些API ZoneId:该类中包含了所有的时区信息,一个时区的ID,如 Europe/Paris ZonedDateTime:一个在ISO-8601日历系统时区的 ...

  5. JDK8中Stream使用解析

    JDK8中Stream使用解析 现在谈及JDK8的新特新,已经说不上新了.本篇介绍的就是Stream和Lambda,说的Stream可不是JDK中的IO流,这里的Stream指的是处理集合的抽象概念『 ...

  6. 标准C++中的string类的用法总结

    标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...

  7. 教程-Delphi中Spcomm使用属性及用法详解

    Delphi中Spcomm使用属性及用法详解 Delphi是一种具有 功能强大.简便易用和代码执行速度快等优点的可视化快速应用开发工具,它在构架企业信息系统方面发挥着越来越重要的作用,许多程序员愿意选 ...

  8. TCP/IP协议栈源码图解分析系列10:linux内核协议栈中对于socket相关API的实现

    题记:本系列文章的目的是抛开书本从Linux内核源代码的角度详细分析TCP/IP协议栈内核相关技术 轻松搞定TCP/IP协议栈,原创文章欢迎交流, byhankswang@gmail.com linu ...

  9. .NET中代理服务器WebProxy的各种用法

    引用地址 引用 因为涉及到代理的各种情况,WebRequest和WebProxy类的文档写的相当复杂,不但各个文档关注点不同,而且不同版本的同一文档也有小小的区别,网上也没有关于这个类的相关文章.于是 ...

随机推荐

  1. 事件驱动框架EventNext之线程容器

    EventNext是.net core下的一个事件驱动的应用框架,通过它代理创建的接口行为都是通过事件驱动的模式进行调用.由于EventNext的所有调用都是基于事件队列来进行,所以在资源控制上非常方 ...

  2. golang实现依赖注入

    golang实现依赖注入 依赖注入是软件工程中经常使用到的一种技术,它提供了一种控制反转的机制,把控制权利交给了调用方.调用方来决定使用哪些参数,哪些对象来进行具体的业务逻辑. 它有几个好处: 1 它 ...

  3. $BZOJ3232$ 圈地游戏 网络流

    正解:最小割+01分数规划 解题报告: 传送门$QwQ$ 感$jio$这个好像是$NOIp2018$集训的时候$cjk$学长讲01分数规划的时候港的,,,?$QwQ$虽然我还是不会嘤 首先看到这个分数 ...

  4. 共识网络BFT-SMaRt:理论与实践

    目录 BFT-SMaRt 简介 分布式计数器服务 功能描述 组网配置 启动节点 常见问题 计数服务 容错服务 BFT-SMaRt 理论 BFT-SMR 典型模式 SMR 状态机复制 VP-Consen ...

  5. 1037 在霍格沃茨找零钱 (20 分)C语言

    题目描述 如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon),二 十九个纳特(Knut)兑一个西可 ...

  6. spring之为什么要使用AOP(面向切片编程)?

    需求1-日志:在程序执行期间追踪正在发生的活动: 需求2-验证:希望计算器只处理正数的运算: 一.普通方法实现 Calculator.java package com.gong.spring.aop. ...

  7. django 数据库连接出现的问题

    mysqlclient 1.3.3 or newer is required; you have 0.7.11: 解决方法: 将报错文件中的如下代码注释: if version < (1, 3, ...

  8. 《图解机器学习-杉山将著》读书笔记---CH3

    CH3 最小二乘学习法 重点提炼 提出最小二乘学习法的缘故: 最小二乘学习法公式 对不同模型进行最小二乘法学习,得到最小二乘公式中的参数theta: 1.线性模型   代入3.1公式,对参数求偏导,偏 ...

  9. Java 中的foreach(增强for循环)

    foreach概述 增强for循环:底层使用的是送代器,使用for循环的格式,简化了送代器的书写,foreach是JDK1.5之后出现的新特性 使用增强for循环 遍历集合 /** * 遍历集合 * ...

  10. invalid expression: missing ) after argument list in xxx 或者 console.error(("[Vue warn]: " + msg + trace));

    效果图:   此处错误原因   中文输入法的 逗号 导致    :   解决方案: 改为 英文输入法的 逗号