文章目录

  • 13 异步回调
    • 13.1 CompletableFuture
    • 13.2 Future 与 CompletableFuture

13 异步回调

同步:指等待资源(阻塞)

异步:指设立哨兵,资源空闲通知线程,否则该线程去做其他事情(非阻塞)

13.1 CompletableFuture

CompletableFuture 在 Java 里面被用于异步编程,异步通常意味着非阻塞,可以使得我们的任务单独运行在与主线程分离的其他线程中,并且通过回调可以在主线程中得到异步任务的执行状态,是否完成,和是否异常等信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dtFH8lVz-1644299753647)(img/014.png)]

CompletableFuture 实现了 Future, CompletionStage 接口,实现了 Future接口就可以兼容现在有线程池框架,而 CompletionStage 接口才是异步编程的接口抽象,里面定义多种异步方法,通过这两者集合,从而打造出了强大的CompletableFuture 类:

  • 异步调用没有返回值方法runAsync
  • 异步调用有返回值方法supplyAsync

主线程调用 get 方法会阻塞

public class CompletableFutureTest {public static void main(String[] args) throws ExecutionException, InterruptedException {// 异步调用没有返回值CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(()->{System.out.println(Thread.currentThread().getName()+" : CompletableFuture");});completableFuture.get();// 异步调用// mq消息队列CompletableFuture<Integer> completableFuture1 = CompletableFuture.supplyAsync(()->{System.out.println(Thread.currentThread().getName()+" : CompletableFuture1");// 模拟异常int i = 10/0;return 1024;});// 完成之后调用completableFuture1.whenComplete((t,u)->{System.out.println("-----t:"+t);    // 方法的返回值System.out.println("-----u:"+u);    // 异常的返回信息}).get();}
}

具体whenComplete的源代码为:

t为返回结果,u为异常信息

public CompletableFuture<T> whenComplete(BiConsumer<? super T, ? super Throwable> action) {return uniWhenCompleteStage(null, action);
}

13.2 Future 与 CompletableFuture

对比这两种方法,一个为同步一个为异步

Futrue 在 Java 里面,通常用来表示一个异步任务的引用,比如我们将任务提交到线程池里面,然后我们会得到一个 Futrue,在 Future 里面有 isDone 方法来 判断任务是否处理结束,还有 get 方法可以一直阻塞直到任务结束然后获取结果,但整体来说这种方式,还是同步的,因为需要客户端不断阻塞等待或者不断轮询才能知道任务是否完成

  1. 不支持手动完成: 我提交了一个任务,但是执行太慢了,我通过其他路径已经获取到了任务结果,现在没法把这个任务结果通知到正在执行的线程,所以必须主动取消或者一直等待它执行完成
  2. 不支持进一步的非阻塞调用: 通过 Future 的 get 方法会一直阻塞到任务完成,但是想在获取任务之后执行额外的任务,因为 Future 不支持回调函数,所以无法实现这个功能
  3. 不支持链式调用: 对于 Future 的执行结果,我们想继续传到下一个 Future 处理使用,从而形成一个链式的 pipline 调用,这在 Future 中是没法实现的。
  4. 不支持多个 Future 合并: 比如我们有 10 个 Future 并行执行,我们想在所有的 Future 运行完毕之后,执行某些函数,是没法通过 Future 实现的。
  5. **不支持异常处理:**Future 的 API 没有任何的异常处理的 api,所以在异步运行时,如果出了问题是不好定位的
    的。
  6. **不支持异常处理:**Future 的 API 没有任何的异常处理的 api,所以在异步运行时,如果出了问题是不好定位的

【JUC并发编程13】异步回调相关推荐

  1. 【尚硅谷】大厂必备技术之JUC并发编程——笔记总结

    [JUC并发编程01]JUC概述 关键字:进程和线程.进程和线程.wait和sleep.并发与并行.管程.用户线程和守护线程 [JUC并发编程02]Lock接口 关键字:synchronized.Lo ...

  2. ❤️《JUC并发编程从入门到高级》(建议收藏)❤️

    JUC并发编程 1.什么是JUC JUC的意思就是java并发编程工具包,与JUC相关的有三个包:java.util.concurrent.java.util.concurrent.atomic.ja ...

  3. 多线程进阶=》JUC并发编程02

    在JUC并发编程01中说到了,什么是JUC.线程和进程.Lock锁.生产者和消费者问题.8锁现象.集合类不安全.Callable(简单).常用辅助类.读写锁 https://blog.csdn.net ...

  4. 狂神说多线程学习笔记整理(二)~JUC并发编程

    1 JUC是什么 juc指 java.util.concurrent包 线程与进程 进程:一个程序的集合,一个进程往往可以包含多个线程,至少包含一个 线程:是执行程序的一次执行过程,它是一个动态的概念 ...

  5. 基于《狂神说Java》JUC并发编程--学习笔记

    前言: 本笔记仅做学习与复习使用,不存在刻意抄袭. -------------------------------------------------------------------------- ...

  6. 多线程进阶=》JUC并发编程

    多线程进阶=>JUC并发编程 1.什么是JUC ​ JUC是java.util.concurrent的简写. ​ 用中文概括一下,JUC的意思就是java并发编程工具包. ​ 并发编程的本质就是 ...

  7. JUC并发编程(java util concurrent)(哔站 狂神说java juc并发编程 摘录笔记)

    JUC并发编程(java util concurrent) 1.什么是JUC JUC并不是一个很神秘的东西(就是 java.util 工具包.包.分类) 业务:普通的线程代码 Thread Runna ...

  8. 爬梯:JUC并发编程(三)

    学习资源整理自:B站<狂神说> 书接上回 JUC并发编程 12.CompletableFuture 异步回调 理解 父类:Future,对将来的某个事件的结果进行建模 可以用ajax进行理 ...

  9. Java JUC并发编程详解

    Java JUC并发编程详解 1. JUC概述 1.1 JUC简介 1.2 进程与线程 1.2 并发与并行 1.3 用户线程和守护线程 2. Lock接口 2.1 Synchronized 2.2 什 ...

最新文章

  1. FPGA之道(72)提高设计的综合性能(四)提高设计的移植性与保密性
  2. Bash Cookbook 学习笔记 【高级】
  3. 文献记录(part27)--A distance for belief functions of orderable set
  4. [SpringSecurity]web权限方案_用户认证_查询数据库完成认证
  5. 《机器学习实战》笔记(02):k-近邻算法
  6. 自学成为动画师?你真的准备好了吗?
  7. Undefined symbols for architecture xxx
  8. Java架构-高并发的解决实战总结方案
  9. Java使用iText实现对PDF文件的操作
  10. JavaScript获取坐标
  11. 计算机辅助个人当面访问,优课联盟——共建共享,学分互认
  12. 无线通信基础知识10:数字通信之双工技术
  13. 数值计算——追赶法求解三对角方程组(附代码)
  14. 装机之必备软件下载合集
  15. TOM邮箱容量满了收发不了邮件?你应该快速做到这些事
  16. 原来收汇宝真的是很烂
  17. 面试中,被问到“哑口无言”的瞬间怎么办?
  18. 开发微信小程序:创建小程序实例
  19. 云数据库ClickHouse资源隔离 - 弹性资源队列
  20. Node.js 从零开发web server博客项目--项目初始化

热门文章

  1. ibatis学习笔记(三)java实体跟表映射.xml文件详解
  2. Cocoa touch(六):UIViewController
  3. 数据结构之表(5)栈的顺序实现
  4. ESP32 各种时钟参数值设置
  5. cmake (3)多个源文件示例
  6. newhope代码在vs2019的编译
  7. Diffie-Hellman密钥交换协议
  8. 【Flask项目】sqlalchemy原生sql查询,返回字典形式数据
  9. optee3.14.0 qemu_v8的环境搭建篇
  10. python报错:UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe0 in position 0: ordinal not in rang