JUC- 异步回调

1.1 Future基本概念

1.1.1 Future设计的初衷

对将来某个时刻会发生的结果进行建模。

1.1.2 CompletableFuture(实现类)

1.1.3 异步回调图解

Future的优点:比更底层的Thread更易用。要使用Future,通常只需要将耗时的操作封装在一个Callable对象中,再将它提交给ExecutorService。

1.2 代码示例

package cn.guardwhy.forkJoin;

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

/*
* 异步调用:completableFuture
* 1. 异步执行
* 2.成功调回
* 3.失败回调
*/
public class CompletableFutureDemo {
    
    
    public static void main(String[] args) throws ExecutionException, InterruptedException {
    
    
        // 1.1没有返回值的runAsync 异步回调
        CompletableFuture<Void> completableFuture1 = CompletableFuture.runAsync(()->{
    
    
           // 1.2 休息2s
            try {
    
    
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "runAsync=>Void");
        });
        System.out.println("123");
        // 1.3 获取阻塞执行结果
        completableFuture1.get();

        System.out.println("======================");

        // 2.1 有返回值的supplyAsync 异步回调
        CompletableFuture<Integer> completableFuture2 = CompletableFuture.supplyAsync(()->{
    
    
            System.out.println(Thread.currentThread().getName() + "supplyAsync=>Integer");
            int i = 10/0;
            return 666;
        });
        System.out.println(completableFuture2.whenComplete((t,u)->{
    
    
            // 2.2 正常的返回结果
            System.out.println("t==>" + t);
            // 2.3 java.util.concurrent.CompletionException
            System.out.println("u==>" + u);
        }).exceptionally((e)->{
    
    
            System.out.println(e.getMessage());
            // 2.4 可以获取到错误的返回结果
            return 111;
        }).get());
    }
}

猜你喜欢

转载自blog.csdn.net/hxy1625309592/article/details/114156068