简介

Java的java.util.concurrent包中提供了并发相关的接口和类,本文将重点介绍CompletableFuture并发操作类

JDK1.8新增CompletableFuture该类

  Class CompletableFuture<T>
java.lang.Object
java.util.concurrent.CompletableFuture<T>
All Implemented Interfaces:
CompletionStage <T>, Future <T>

可见源码中,CompletableFuture是个泛型类,意味着,肯定有地方能够传入或返回所指定的泛型类对象,在java8源码中

public class CompletableFuture<T> implements Future<T>, CompletionStage<T> {
volatile Object result; // Either the result or boxed AltResult
volatile Completion stack; // Top of Treiber stack of dependent actions ...//部分源代码省略
}

在JDK1.8的源码中,我们看见,在类定义下,最前面两个代码,定义了两个volatile的变量,我们都知道volatile变量,主要有两个作用

1.保证变量在不同线程之间的可见性,修改该变量系统会及时刷新到主内存,各线程读取的时候从主内存中读取;

2.禁止指令重排序,通过内存屏障的方式禁止指令被编译优化后的重排序。

它所实现的两个接口:Future和CompletionStage

1.Future接口



Future接口,在java多线程编程中用到很多,综合来看主要有两个方向上会用到

1.通过另外一个线程运行,并带返回值,通过future的方式传回返回值

2.程序在主线程中新建并运行新的线程后,主线程需要拿到结果,可以通过future.get阻塞的方式等待线程运行结束并拿回结果。

2.CompletionStage接口

这个主要提供异步线程任务提交、运行的管理,future主要是异步线程运行结果的管理。

综合来看CompletableFuture

1.创建任务

由于CompletableFuture中JDK8版本出来的,所以对JDK8有了非常好的支持

runAsync(Runnable)

supplyAsync(Supplier)

等等

2.获取任务结果

get()方法,获取返回值的时候,如果任务没有运行完成,则阻塞并一直等到任务结束并返回结果,而在这中间,如果持有这个completableFutre对象可以通过completableFuture.compleate(T)来手动地将结果返回get,并唤醒调用get()线程,任务线程即使运行完再返回去也接受不到了,因为已经被compleate提前返回结果了。

getNow(T vluaeIfAbsent),当调用此方法的时候,如果任务已经完成,则直接拿到返回值,如果没有则获取预设定的值,而线程运行状态不会发生改变

实例

get和getNow的区别

get阻塞代码,只到任务运行完成返回结果或者直到有人调用compleate(T)

    public static void main(String[] args) {
//通过这种方式来创建一个复杂的Student并返回
CompletableFuture<Student> studentCompletableFuture = CompletableFuture.supplyAsync(() -> {
//为了模拟复杂情行
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return new Student("yan", 50);
});
//如果任务没有结束,就调用getNow的话,则返回getNow方法传入的内容
Student student = studentCompletableFuture.getNow(new Student("wang",20));
System.out.println(student.getAge());//输出20
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
e.printStackTrace();
}
student = studentCompletableFuture.getNow(new Student("wang",20));
System.out.println(student.getAge());//输出50
}

get和compleate(T)使用

    public static void main(String[] args) {
//通过这种方式来创建一个复杂的Student并返回
CompletableFuture<Student> studentCompletableFuture = CompletableFuture.supplyAsync(() -> {
//为了模拟复杂情行
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我能不能运行到?");
return new Student("yan", 50);
}); ExecutorService executorService = Executors.newCachedThreadPool(); executorService.execute(() -> {
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
studentCompletableFuture.complete(new Student("wang", 25));
}); executorService.execute(() -> {
System.out.println(Thread.currentThread().getName()); try {
Student student = studentCompletableFuture.get();
System.out.println(student.getAge());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}); try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
try {
Student student = studentCompletableFuture.get();
System.out.println(student.getAge());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} }

执行输出结果

    ForkJoinPool.commonPool-worker-1
pool-1-thread-1
pool-1-thread-2
25
我能不能运行到?
main
25

java并发编程——CompletableFuture的更多相关文章

  1. Java并发编程有多难?这几个核心技术你掌握了吗?

    本文主要内容索引 1.Java线程 2.线程模型 3.Java线程池 4.Future(各种Future) 5.Fork/Join框架 6.volatile 7.CAS(原子操作) 8.AQS(并发同 ...

  2. [Java并发编程(二)] 线程池 FixedThreadPool、CachedThreadPool、ForkJoinPool?为后台任务选择合适的 Java executors

    [Java并发编程(二)] 线程池 FixedThreadPool.CachedThreadPool.ForkJoinPool?为后台任务选择合适的 Java executors ... 摘要 Jav ...

  3. Java并发编程中的若干核心技术,向高手进阶!

    来源:http://www.jianshu.com/p/5f499f8212e7 引言 本文试图从一个更高的视角来总结Java语言中的并发编程内容,希望阅读完本文之后,可以收获一些内容,至少应该知道在 ...

  4. Java并发编程系列-(9) JDK 8/9/10中的并发

    9.1 CompletableFuture CompletableFuture是JDK 8中引入的工具类,实现了Future接口,对以往的FutureTask的功能进行了增强. 手动设置完成状态 Co ...

  5. Java并发编程--基础进阶高级(完结)

    Java并发编程--基础进阶高级完整笔记. 这都不知道是第几次刷狂神的JUC并发编程了,从第一次的迷茫到现在比较清晰,算是个大进步了,之前JUC笔记不见了,重新做一套笔记. 参考链接:https:// ...

  6. 【Java并发编程实战】----- AQS(四):CLH同步队列

    在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...

  7. 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport

    在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...

  8. 【Java并发编程实战】----- AQS(二):获取锁、释放锁

    上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...

  9. 【Java并发编程实战】-----“J.U.C”:CLH队列锁

    在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列.他能够确保无饥饿,严格的先来先服务的公平性.下图是CLH队列节点的示意图: 在CLH队列的节点QN ...

  10. 【Java并发编程实战】-----“J.U.C”:CountDownlatch

    上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...

随机推荐

  1. 进一步释放技术红利,阿里云推出全新内存增强型实例re6,性能提升30%

    5月7日,国内最大云计算厂商阿里云宣布推出全新一代内存增强型实例,提供1:14.8超大内存比内存容量,满足内存型数据库如SAP HANA.Redis等应用,充分释放技术红利,帮助线下企业快速上云,完成 ...

  2. 龙蜥开源Plugsched:首次实现 Linux kernel 调度器热升级 | 龙蜥技术

    ​简介:对于plugsched而言,无论是 bugfix,还是性能优化,甚至是特性的增.删.改,都可胜任. ​ 文/龙蜥社区内核开发人员 陈善佩.吴一昊.邓二伟 Plugsched 是 Linux 内 ...

  3. 前沿分享|阿里云资深技术专家 魏闯先:AnalyticDB PostgreSQL年度新版本发布

    ​简介: 本篇内容为2021云栖大会-云原生数据仓库AnalyticDB技术与实践峰会分论坛中,阿里云资深技术专家 魏闯先关于"AnalyticDB PostgreSQL年度新版本发布&qu ...

  4. 获国际架构顶会ATC2021最佳论文!Fuxi2.0去中心化的调度架构详解

    简介: 近日,在国际体系架构顶会USENIX ATC2021上,阿里云飞天伏羲团队与香港中文大学合作的一篇论文<Scaling Large Production Clusters with Pa ...

  5. Docker镜像基本原理

    前言 Docker系列文章: 如果没有安装过Docker请参考本文最后部分,大家从现在开始一定要按照我做的Demo都手敲一遍,印象会更加深刻的,加油! 为什么学习Docker Docker基本概念 什 ...

  6. appium测试混合应用

    最近用appium测试公司APP,APP是原生+H5的模式,测试过程中发现大部分H5的页面使用原生的方式可以进行操作,只有少部分H5页面的按钮虽然在uiautomatorviewer的界面能解析出来, ...

  7. 一键自动化博客发布工具,用过的人都说好(oschina篇)

    oschina和segmentfault一样,界面非常的清爽. 界面上除了必须的标题,内容之外,还有文章专辑和推广专区这几个选项. 一起来看看在blog-auto-publishing-tools中, ...

  8. ubuntu下安装php pdo扩展和导入数据库

    默认安装的php不存在pdo扩展,因此在使用到的时候会报错,直接使用这个命令 apt-get install php-mysql 就可以成功安装pdo扩展 安装完数据库后需要导入sql语句,先进入数据 ...

  9. Golang 之 casbin(权限管理)

    目录 1. 权限管理 官网 编辑器测试 1.1.1. 特征 Casbin的作用 Casbin不执行的操作 1.1.2. 怎么运行的 1.1.3. 安装 1. 示例代码 xormadapter 2. 示 ...

  10. DNS(4) -- dns功能实现-配置正向解析和反向解析以及DNS递归查询示例

    目录 1 DNS配置示例 1.1 DNS解析类型 1.2 配置正向解析 1.3 配置反向解析 1.4 DNS递归查询 1.4.1 开启递归查询 1.4.2 关闭递归查询 1 DNS配置示例 1.1 D ...