JUC高级多线程_10:Future异步回调的具体介绍与使用

Posted ABin-阿斌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JUC高级多线程_10:Future异步回调的具体介绍与使用相关的知识,希望对你有一定的参考价值。

我是 ABin-阿斌:写一生代码,创一世佳话。 如果小伙伴们觉得我的文章有点 feel ,那就点个赞再走哦。
在这里插入图片描述

1.Future简介

  • Futurejava1.5 引入的一个 interface,可以方便的用于异步结果的获取。
  • Future 代表的是异步执行的结果,意思是当异步执行结束之后,返回的结果将会保存在 Future 中。

2.Future的使用场景

  • 当我们执行一个长时间运行的任务时,使用 Future 就可以让我们暂时去处理其他的任务,等长任务执行完毕再返回其结果。
  • 当我们需要进行大量数据处理的时候
  • 当我们需要调用远程方法时
  • 涉及到复杂的密集计算时

3.Future的具体使用

3.1 对应的方法介绍

  • CompletableFuture.runAsync(): 没有返回值

源码展示:

在这里插入图片描述

案例展示:

public static void main(String[] args) throws Exception {
        /**
         * CompletableFuture.runAsync():没有返回值
         */
        //需要传入一个 Runnable 接口类型的参数
        CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(() -> {
            try {
                //设置睡眠时间
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + ":执行任务————>runAsync<————没有返回值");
        });
        //获取阻塞执行结果值
        completableFuture.get();

  • CompletableFuture.supplyAsync() :有返回值

源码展示:

在这里插入图片描述

  • whenComplete: 参数列表 (T t,U u),如果执行过程正常完成,则执行该分支
    • 参数介绍: BiConsumer ——> Binary Consumer ,也就是需要两个参数 (T,U),且没有返回值

源码展示:
在这里插入图片描述

  • exceptionally: 如果执行任务出现异常,则执行 exceptionally 中的代码块,并且需要一个返回值

源码展示:

  • 注意: 这里的参数是一个 Function 类型的函数式接口

在这里插入图片描述
案例展示:

public static void main(String[] args) throws Exception {
 		/**
         * CompletableFuture.supplyAsync():有返回值
         */
        CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getName() + ":执行任务————>supplyAsync<————有返回值");
            int a = 10 / 0;

            return 200;
        });

        //whenComplete:参数列表 (T t, U u),如果执行过程正常完成,则执行该分支
        System.out.println(completableFuture.whenComplete((t, u) -> {
            System.out.println("————>异步回调结果:" + t);
            System.out.println("————>异常信息结果:" + u);

            //exceptionally :如果执行过程出现异常,则走该分支
        }).exceptionally((f) -> {
            System.out.println("—————>异常详细信息:" + f.getMessage());
            return 500;
        }).get());
    }
 }

输出结果展示: 有异常

在这里插入图片描述

输出结果展示: 无异常

在这里插入图片描述

以上是关于JUC高级多线程_10:Future异步回调的具体介绍与使用的主要内容,如果未能解决你的问题,请参考以下文章

JUC高级多线程_08:线程池的具体介绍与使用

java多线程异步回调Future

JUC高级多线程_09:ForkJoin框架的具体介绍与使用

JUC高级多线程_04:高并发下集合类的具体使用

JUC高级多线程_11:JMM与Volatile的具体介绍与使用

JUC高级多线程_07:读写锁与阻塞队列的具体介绍与使用