JUC并发编程(基础入门六)——Future 异步回调

1异步回调

1什么是 Callable 和 Future?

Callable 接口类似于 Runnable,从名字就可以看出来了,但是 Runnable 不会返回结果,并且无法抛出返回结果的异常,而 Callable 功能更强大一些,被线程执行后,可以返回值,这个返回值可以被 Future 拿到,也就是说,Future 可以拿到异步执行任务的返回值。

Future 接口表示异步任务是一个可能还没有完成的异步任务的结果。所以说 Callable用于产生结果,Future 用于获取结果。

2什么是 FutureTask

FutureTask 表示一个异步运算的任务。FutureTask 里面可以传入一个 Callable 的具体实现类可以对这个异步运算的任务的结果进行等待获取、判断是否已经完成、取消任务等操作只有当运算完成的时候结果才能取回,如果运算尚未完成 get 方法将会阻塞。一个 FutureTask 对象可以对调用了 Callable 和 Runnable 的对象进行包装,由于 FutureTask 也是Runnable 接口的实现类,所以 FutureTask 也可以放入线程池中。

在这里插入图片描述

3没有返回值的runAsync异步回调

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

public class Test {
    
    
    public static void main(String[] args) throws ExecutionException, InterruptedException
    {
    
    
        // 没有返回值的runAsyn异步回调
        // 发起 一个 请求
        CompletableFuture<Void> future = CompletableFuture.runAsync(()->{
    
    
            //发起一个异步任务
            try {
    
    
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+".....");
        });
        System.out.println("1111");
        //输出执行结果
        System.out.println(future.get());  //获取阻塞执行结果
    }

}

2有返回值的异步回调supplyAsync

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

public class Test {
    
    
    public static void main(String[] args) throws ExecutionException, InterruptedException {
    
    
        // 有返回值的异步回调
        //ajax 成功和失败的回调
        // 返回的错误信息
        CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
    
    
            System.out.println(Thread.currentThread().getName() + "supplyAsync");
            int i = 10/0;
            return 1024;
        });
        System.out.println(completableFuture.whenCompleteAsync((T, U) -> {
    
    
            System.out.println("T=" + T); //正常的返回结果
            System.out.println("U=" + U); //错误信息 java.util.concurrent.CompletionException: java.lang.ArithmeticException: / by zero
        }).exceptionally((e) -> {
    
    
            e.printStackTrace();
            return 233; // 可以获取到错误的返回结果
        }).get());
    }
}

在这里插入图片描述

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

public class Test {
    
    
    public static void main(String[] args) throws ExecutionException, InterruptedException {
    
    
        // 有返回值的异步回调
        //ajax 成功和失败的回调
        // 返回的错误信息
        CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
    
    
            System.out.println(Thread.currentThread().getName() + "supplyAsync");
            return 1024;
        });
        System.out.println(completableFuture.whenCompleteAsync((T, U) -> {
    
    
            System.out.println("T=" + T); //正常的返回结果
            System.out.println("U=" + U);
        }).exceptionally((e) -> {
    
    
            e.printStackTrace();
            return 233; 
        }).get());
    }



}

在这里插入图片描述
whenComplete: 有两个参数,一个是t 一个是u
T:是代表的 正常返回的结果;
U:是代表的 抛出异常的错误信息;
如果发生了异常,get可以获取到exceptionally返回的值;

猜你喜欢

转载自blog.csdn.net/zs18753479279/article/details/114204268