今天面试突然被问题到java异步操作,恰好最近在看小狂神的JUC教程,不过正好只差这一集没有看到,气得我真想抽自己两巴掌。
先上两个Demo:
无返回值类型:
package com.allen.futrue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
public class FutureDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(()->{
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "->runAsync");
        });
        System.out.println("123");
        completableFuture.get();
    }
}运行结果:

如上图所见,控制台先输出123,然后是等待睡眠两秒结束后异步输出了线程的名称。
有返回值类型:
package com.allen.futrue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
public class FutureDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(()->{
            System.out.println(Thread.currentThread().getName() + "->runAsync");
            //制造异常System.out.println(1 / 0);
            return 200;
        });
        completableFuture.whenComplete((t, u)->{
            System.out.println("t->" + t);
            System.out.println("u->" + u);
        }).exceptionally((e)->{
            System.out.println(e.getMessage());
            return 500;
        });
    }
}没有异常正常返回:

我们得到结论:t为return的值。
当有了异常的情况:

t返回null,u为异常信息。
同时Futrue也会执行exceptionally里面的代码。