JUC之 completableFuture
前身 Future
作用
- 定义了操作异步任务执行的一些方法,如获取异步任务的执行结果、取消任务的执行、判断任务执行是否完毕等。专门用来为主线程处理耗时的任务
特点
- 多线程
- 有返回值
- 异步处理
实现类FutureTask
代码示例
public class FutureThread {public static void main(String[] args) throws ExecutionException, InterruptedException {FutureTask<String> futureTask = new FutureTask<>(new mythread2());Thread t1 = new Thread(futureTask,"t1");
t1.start();String s = futureTask.get();System.out.println(s);}}class mythread2 implements Callable<String>{@Overridepublic String call() throws Exception {System.out.println("come in deep dark fantasy!");return "callable的返回值捏";}
}
缺点
- get方法获取值直到线程结束才会继续向下执行,容易阻塞
- isDone不断轮询会消耗cpu资源
CompletableFuture
优点
- 回调通知执行结果,不会阻塞
- 异步执行
- 可以组合处理多个任务
- 对计算速度进行选用)
调用静态方法初始化
- 当不传线程池参数时则自动调用ForkJoinPool线程池。
whenComplete回调方法
- 当执行结束后自动执行该方法的代码,无需阻塞
- 参数为BiConsumer<T,E> 代表两个参数无返回值,T代表上一步返回的值,E代表抛出的异常
get和join的区别
- 二者的作用相同,都是获取CompletableFuture的返回值,但是get需要处理检查型异常,也就是必须抛出或者处理,而join则不用处理。
thenApply和handle(对计算结果进行处理)
相同点
- 计算结果存在依赖关系,串行化执行,需要上一个返回值来当成参数
不同点
- 当thenApply中出现异常时后续不再执行
- 当handler中出现异常时,后续不会受到影响,继续执行
thenAccept(计算结果病并消费、无返回结果)
thenRun、thenAccept、thenApply对比
thenRun和thenRunAsync区别(线程池运行选择)
applyToEither(对计算速度进行选用、谁快用谁)
thenCombine(对计算结果进行合并)
- 两个CompletionStage任务都完成后、最终能把两个任务的结果一起交给thenCombine来处理
JUC之 completableFuture相关推荐
- JUC高级一: CompletableFuture
JUC高级: CompletableFuture 1. 线程基础知识复习 1.1 JUC四大口诀 高内聚低耦合前提下,封装思想 线程->操作---->资源类 判断.干活.通知 防止虚假唤醒 ...
- JUC系列(十一) | Java 8 CompletableFuture 异步编程
多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!! 沉下去,再浮上来,我想我们会变的不一样 ...
- JUC进阶-NO.2 CompletableFuture
文章目录 ⭐NO.2 CompletableFuture 一. Future和Callable接口 1.Future 2.Callable 二. FutureTask的缺点 1.FutureTask: ...
- Java——聊聊JUC中的CompletableFuture
文章目录: 1.承接Future和FutureTask 2.CompletableFuture四大静态方法 2.1 runAsync(Runnable runnable) 2.2 runAsync(R ...
- 【JUC】第六章 Fork/Join 框架、CompletableFuture
第六章 Fork/Join 框架.CompletableFuture 文章目录 第六章 Fork/Join 框架.CompletableFuture 一.Fork/Join 框架 1.简介 2.For ...
- JUC并发编程-CompletableFuture
CompletableFuture基本介绍 阻塞的方式和异步编程的设计理念相违背,而轮询的方式会消耗无畏的CPU资源.因此,JDK8设计出CompletableFuture 核心的四个静态方法(分为两 ...
- 面试高频——JUC并发工具包快速上手(超详细总结)
目录 一.什么是JUC 二.基本知识 2.1.进程和线程 2.2.Java默认有两个进程 2.3.Java能够开启线程吗? 2.4.并发和并行 2.5.线程的状态 2.6.wait和sleep的区别 ...
- juc java_深入理解JUC(java.util.concurrent)
Concurrent下的核心类 Executor:具有runnable任务的执行者 ExecutorService:一个线程池管理者,实现类有多种,能把runnable,callable提交到线程池中 ...
- 多线程总结-JUC中常用的工具类
本文只记录JUC中较常用到的一些工具类,只是列举其常见的使用方法,至于其实现原理,此处不做说明. CountDownLatch 一个同步工具类,允许一个或多个线程一直等待,直到其他线程运行完成后再执行 ...
最新文章
- 「智源论坛·学者报告会」报名: 面向高效推理的深度网络结构设计
- 上班请病假还得看AI脸色,10秒钟判别真假,打工人太难了
- 普中28335开发攻略_TMS320F28335项目开发记录1_CCS的使用介绍
- Vue、React 之间如何实现代码移植?
- C++primer 第 3 章 字符串、向量和数组 3.1 命名空间的using声明 3.2标准库类型string
- linux 网络块存储,网络存储集群
- 洛谷 P1137 旅行计划
- 1068. Find More Coins (30)
- POJ2115 C Looooops 扩展欧几里德
- ARM 中断状态和SVC状态的堆栈切换 (异常)【转】
- 税务Ukey如何进行批量开票
- OSM PBF 文件格式说明
- 2018最新苹果APP上架App Store流程(超详细)
- 使用bedtools进行gwas基因注释
- 【Steam VR 2.0】3. Skeleton Poser 自定义抓取手势的使用
- Half a million dollars is or are a lot of money?
- 牛客国庆集训派对Day1 C-Utawarerumono(扩展欧几里得)
- 金山发布毒霸V及网镖V新品 坚持高定价策略
- vuex vue-router
- Go语言sqlx库操作PostgreSQL数据库增删改查
热门文章
- 软件工程第一次结对作业unity项目展示
- XYNUOJ 天明的智商
- 华为哪些手机可以升级到鸿蒙系统,终于来了!华为手机6月可升级到鸿蒙OS系统,什么是华为鸿蒙系统?...
- Tom和Jerry来了,Tom和Jerry走了——北漂18年(38)
- Linux设备异常断电导致的SD卡损坏的解决方案
- Delaunay Triangulation
- 深度学习库 caffe使用 源码分析 依赖库分析 caffe glog gflags openBlas prototxt yolo_darknet 转 caffe
- 异性员工避免封闭空间独处、单独约饭、肢体接触,万亿级公司竟然这样规定!!!...
- wordpress加速插件_12个插件来加速您的WordPress网站
- 用Python3爬去今日头像图片