没有返回值的异步调用
/**
* 异步调用:CompletableFuture
* 异步执行
* 成功回调
* 失败回调
*/
public class Test {
public static void main(String[] args) throws Exception {
runAsync();
}
public static void runAsync()throws Exception{
// 没有返回值的runAsync异步回调
CompletableFuture completableFuture = CompletableFuture.runAsync(()->{
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"没有返回值的异步回调");
});
System.out.println("main线程");
completableFuture.get();
}
}
执行结果:
main线程
ForkJoinPool.commonPool-worker-1没有返回值的异步回调
有返回值的异步调用
public static Integer supplyAsync() throws Exception {
//有返回值的异步调用
CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(()->{
System.out.println(Thread.currentThread().getName()+"有返回值的异步回调");
return 1024;
});
System.out.println(completableFuture.whenComplete((t, u) -> {
System.out.println("t->" + t); //正常的返回结果
System.out.println("u->" + u); //错误信息
}).exceptionally((e) -> {
e.printStackTrace();
return 500;
}).get());
return null;
}
正确执行:
ForkJoinPool.commonPool-worker-1有返回值的异步回调
t->1024
u->null
1024
错误执行:
ForkJoinPool.commonPool-worker-1有返回值的异步回调
t->null
u->java.util.concurrent.CompletionException: java.lang.ArithmeticException: / by zero
500
java.util.concurrent.CompletionException: java.lang.ArithmeticException: / by zero
at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:273)
at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:280)
at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1606)
at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1596)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1067)
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1703)
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:172)
Caused by: java.lang.ArithmeticException: / by zero
at juc.异步回调.Test.lambda$supplyAsync$1(Test.java:35)
at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1604)
... 5 more