Java JUC并发之异步回调

十五、异步回调

异步调用 类似于Ajax => 调用的结果不需要等待

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

一般使用Future的增强类: CompletableFuture

常用的方法:

  • runAsync(Runnable run) 没有返回值的异步回调
    runAsync(Runnable run , Executors executor)
  • supplyAsync(Runnable run) 有返回值的异步回调
// 没有返回值的异步回调 runAsync()
CompletableFuture<Void> completableFuture = CompletableFuture.runAsync( ()->{ // 静态方法 由类直接调用
    try {
        TimeUnit.SECONDS.sleep(2);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName() + " runAsync => Void");
});
completableFuture.get(); // 获取执行结果
System.out.println("ybb");
package com.liu.future;

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

/**
 * 异步调用:Ajax
 *
 * 1. 异步执行
 * 2. 成功回调
 * 3. 失败回调
 */
public class Demo01 {

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

/*
        // 没有返回值的异步回调 runAsync()
        CompletableFuture<Void> completableFuture = CompletableFuture.runAsync( ()->{
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " runAsync => Void");
        });
        completableFuture.get(); // 获取执行结果
        System.out.println("ybb");
*/
        // 有返回值异步回调 supplyAsync
        CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(()->{
            System.out.println(Thread.currentThread().getName() + " supplyAsync => Integer");
            int i = 10/0;
            return 200; // 正常执行
        });

        System.out.println(completableFuture.whenComplete((t, u) -> { // 完成时执行
            System.out.println("t=> " + t);
            System.out.println("u=> " + u);
        }).exceptionally((e) -> {// 失败回调
            System.out.println(e.getMessage());
            return 404;
        }).get()); // 需要将get()的结果输出 才能看到返回值

        /** http状态码 类似
         * 请求成功=> Success Code :200
         * 请求失败=> Error Code : 404 500
         */
    }
}
posted @ 2021-07-15 17:42  夕立君  阅读(121)  评论(0编辑  收藏  举报