文章目录

  • 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. 人群计数--Mixture of Counting CNNs
  2. unity项目源码_在Unity中使用protobuf
  3. 【Scratch】青少年蓝桥杯_每日一题_5.25_排序
  4. UI5 libraries determined in Backend
  5. 再快的86也追不上会漂移的无人汽车
  6. 没有计算机的一天英语作文带翻译,初一英语作文我的一天带翻译
  7. 编程语言五花八门,哪种可以让程序员赚到更多钱?
  8. 并发 - 生产者消费者的问题
  9. Visual Studio Code for DBA的介绍
  10. 【动态规划】状压dp:蓝桥2020补给(旅行商问题)
  11. java无法输出_这个java程序为什么不能输出结果?
  12. PL / SQL教程
  13. 在win10下安装Linux双系统
  14. 规则引擎 clara-rules
  15. 数组中除一个元素外其他所有元素出现二或三次,找到只出现一次的元素
  16. 利用jink的驱动软件j-flash 合并两个hex的方法,bootloader+app -(转载)
  17. STM32SD卡实现USB虚拟U盘
  18. 淘宝直通车定向推广怎么开技巧 直通车定向推广实操深度解析
  19. csdn怎么了???
  20. dlink交换机(DLINK交换机灯)

热门文章

  1. docker 在esx上的网络配置
  2. 【基础】利用thrift实现一个非阻塞带有回调机制的客户端
  3. 设计模式研究(二)-Singleton
  4. winhex把二进制文件转换为C语言格式的流程
  5. 在/sys目录下建立一个文件,并且实现信息的读取和存储
  6. 【Flask项目2】多进程下的日志文件(2)
  7. [ARM-assembly]-ARMv8 A64 Quick Reference
  8. [register]-ARMV8-aarch64 部分系统寄存器总结(必背)
  9. [ARM-assembly]-A64的load/store指令总结
  10. 绕过TracerPid检测