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
*/
}
}
本文来自博客园,作者:{夕立君},转载请注明原文链接:https://www.cnblogs.com/xili-sanriyue/p/15016700.html