异步回调,用一个例子带你起飞!

news/2024/5/20 6:50:59 标签: 多线程, juc, 并发编程,

1.Future接口
Future 设计的初衷: 对将来的某个事件的结果进行建模

异步回调:
在这里插入图片描述

在这里插入图片描述
这里基本不怎么直接使用future,而是使用它的一个实现类CompletableFuture,这个类的很多方法都是加强了的,比较怕常用。
2.CompletableFuture类

在这里插入图片描述

接下俩就让我们用一个小例子来看看这个类是怎么来操作异步回调的吧
3.简单代码实现

*没有返回值的情况:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

/**
 * @program: juc
 * @description
 * @author: 不会编程的派大星
 * @create: 2021-04-27 20:56
 **/
public class CompletableFutureTask1 {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(() -> {
            try {
                TimeUnit.SECONDS.sleep(4);  //这里用延迟一个任务需要花费的时间
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " 我不需要返回结果");
        });

        System.out.println("hello "); 

        completableFuture.get(); //获取异步后的结果 -- 回调

    }
}

执行结果:
在这里插入图片描述
注:这里即使completableFuture的执行体在打印hello这行代码的前面,但依旧是先打印hello,再回调得到异步的结果
这里就好比 小明在未来的30分钟类要买水和上厕所 ,但是他已经憋不住了,于是乎他让小红去帮他买水,然后他去上厕所先,等上完厕所,他在喊小红把买的水给他,这样就节省了时间,提升了做事效率。

*需要返回结果的情况,成功时和失败时返回

import java.util.concurrent.CompletableFuture;

/**
 * @program: juc
 * @description
 * @author: 不会编程的派大星
 * @create: 2021-04-27 21:14
 **/
public class CompletableFutureTask {

    public static void main(String[] args) {

        CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
          //错误时返回
            //int i = 10 /0;
            return 1024;
        });

        completableFuture.whenComplete((u,t) -> {
            System.out.println("u--->"+u);
            System.out.println("t--->"+t);
        }).exceptionally((e) -> {
            e.getMessage();
            return 200;
        });


    }
}

成功时返回:
whenComplete方法,可以看出里面所传的参数为BiConsumer 需要传 t和u两个参数:

在这里插入图片描述

执行结果:
在这里插入图片描述

失败时返回:
在这里插入图片描述

注:这里可以看出 u 和 t两个参数,一个是返回成功的结果,而另一个则是返回时的结果,正确和错误时,都可以拿到!

这次的讨论就到这里,欢迎留言讨论!


http://www.niftyadmin.cn/n/1715650.html

相关文章

vb6反编译详解_[原创]VB6反编译详解(一)

[原创]VB6反编译详解(一)2006-7-9 16:5923171[原创]VB6反编译详解(一)2006-7-9 16:5923171VB6反编译详解 by Kenmark-Fenix**************************************************最新于2006-7-13更新&#xff01;**************************************************写本文已经惦…

就算错过,也不进来看看?volatile保证可见性、非原子性以及避免指令重排(内存屏障)详解

一.JMM–Java内存模型 *1.什么是JMM&#xff1f; JMM &#xff1a; Java内存模型&#xff0c;不存在的东西&#xff0c;是一种概念&#xff01;是一种约定&#xff01; *2.关于JMM的一些同步的约定&#xff1a; 1、线程解锁前&#xff0c;必须把共享变量立刻刷回主存。 2、…

linux怎样自制库_Linux 库的制作--动态库与静态库

Linux 库的制作1.动态库 xxx.so2.静态库 xxx.a相同点:库中都有一组实现好的函数接口不同点:如果我们连接的是动态库&#xff0c;此时只是在可执行文件的头信息中记录动态库的名字&#xff0c;具体函数的实现代码并没有存放在可执行文件中&#xff0c;所以在可执行文件执行的时候…

准备好了吗?带你读底层!深入理解CAS ,从juc原子类一路追溯到unsafe类再到ABA原子引用!

一&#xff1a;什么是CAS&#xff1f; CAS&#xff0c;在Java并发应用中通常指CompareAndSwap或CompareAndSet&#xff0c;即比较并交换。 CAS是一个原子操作 是用于实现多线程同步的原子指令&#xff0c;它比较一个内存位置的值并且只有相等时修改这个内存位置的值为新的值&…

c++返回指针的下一个位置_Java经典算法:在每个节点中填充下一个右指针

给定以下完美的二叉树&#xff0c;1个/ 2 3///4 5 6 7调用函数后&#xff0c;树应如下所示&#xff1a;1->空/ 2-> 3->空///4-> 5-> 6-> 7->空Java解决方案1-简单公共 无效连接( TreeLinkNode根) {如果(根 null )返回;LinkedList < TreeLinkNode > …

和 远程文件夹同步_使用Unison 同步文件

Unison是一个跨平台的文件同步工具&#xff0c;它在同步计算机或存储设备之间的数据时非常有用。环境Centos7(1): 192.168.43.165Centos7(2): 192.168.43.166安装Unison在两个系统中都要安装epel源&#xff0c;然后都要安装unison&#xff1a;[root192_168_43_165 ~]# yum -y i…

8g内存和16g内存区别 mac_【双8G内存比16G内存速度快?详解双通道内存和磁盘阵列】...

前言&#xff1a;目前为止大多数游戏对于内存的需求是越来越高了&#xff0c;所以我在写单子的时候都尽可能的写8GX2这种组合&#xff0c;这时候就有很多人&#xff0c;而且几乎是全部的人&#xff0c;都会问我可不可以直接买单16G呢&#xff0c;所以我们今天来详细了解一下双8…

类的加载器以及类加载过程

1.类的加载图示 2.简述类的加载过程 当程序要使用某个类时&#xff0c;如果该类还未被加载到内存中&#xff0c;则系统会通过类的加载、类的链接、类的初始化这三个步骤来对类进行初始化。如果不出现意外&#xff0c;JVM将会连续完成这三个步骤&#xff0c;所以有时也把这三…