【多线程学习】异步回调

「这是我参与11月更文挑战的第21,活动详情查看:2021最后一次更文挑战

异步执行:当主线程需要执行一个复杂耗时的计算任务,我们可以通过Future获取计算结果
把这个任务放在独立的线程(池)中执行,然后主线程继续处理其他任务,处理完成后再通过Future获取计算结果

异步任务

模拟执行一个异步执行任务,在异步中打印一句,在异步任务之后也执行打印。程序执行就不会先等异步任务执行完毕在执行打印,而是不管异步先执行程序主要执行的任务,获取异步任务的返回值会等到异步任务执行完毕之后才会等待

异步回调也分有返回值的异步回调和没有返回值的异步回调,这里采用CompletableFuture来实现,CompletableFuture提供了一种机制可以让任务执行完成后通知监听的一方,类似设计模式中的观察者模式

  1. 没有返回值的异步回调 CompletableFuture.runAsync

image.png

运行结果

image.png

  1. 有返回值的异步回调 CompletableFuture.supplyAsync

正常情况下但是当我们在我们异步线程中产生了错误的话就会非常麻烦,因为错误的异常不会告知给你,就在异步线程中是感知不到的,而且get方法还会被阻塞,但是CompletableFuture可以返回异常信息就很好的解决了这个问题

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
    System.out.println(Thread.currentThread().getName() + " supplyAsync");
    return 200;
});

future.whenComplete((t,u) -> {
    System.out.println("t: " + t); //正常的返回结果
    System.out.println("u: " + u); //错误信息
}).exceptionally((e) -> {
    System.out.println(e.getMessage());
    return 500;
}).get();
复制代码

有返回的异步回调,当异步出现错误的时候,可以拿到错误信息,程序中是正常情况下一个异步任务,查看运行结果,没有任何错误信息

image.png

可以故意给程序制造异常int i = 10/0;,查看输出结果,就会看到程序会将错误信息打印出来

image.png