15、異步回調:Futrue 的實現類CompletableFuture
概述
Futrue 設計初衷: 對將來會發生的結果進行建模~
程序的性能要高,要異步處理!同步並阻塞!
A 線程做完了返回一個結果告訴main我做完了!
Futrue就相當於ajax。
實例:CompletableFuture無返回結果情況測試
package com.interview.concurrent.completablefuture;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
/**
* @author yangxj
* @description 描述
* CompletableFuture 異步回調, 對將來的結果進行結果,ajax就是一種異步回調!
* @date 2020/2/24 21:32
*/
public class CompletableFutureDemo {
public static void main(String[] args) throws Exception {
// 多線程也可以異步回調
voidCompletableFuture();
}
/**
* @description: CompletableFuture 的 runAsync方法,沒有返回結果,任務執行完了就完畢了
* 適用場景:插入數據,修改數據
* @author yangxj
* @date 2020/2/24 21:59
*/
public static void voidCompletableFuture() throws ExecutionException, InterruptedException {
CompletableFuture<Void> voidFuture = CompletableFuture.runAsync(() -> {
System.out.println(Thread.currentThread().getName() + ":沒有返回結果");
});
System.out.println(voidFuture.get()); //null
}
}
運行結果如下:
實例:CompletableFuture有返回結果情況測試
程序正常運行情況
package com.interview.concurrent.completablefuture;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
/**
* @author yangxj
* @description 描述
* CompletableFuture 異步回調, 對將來的結果進行結果,ajax就是一種異步回調!
* @date 2020/2/24 21:32
*/
public class CompletableFutureDemo {
public static void main(String[] args) throws Exception {
// 多線程也可以異步回調
returnCompletableFuture();
}
/**
* @description:有返回結果 ,功能像ajax。 成功或者失敗!
* 適用場景:
* 可異步執行的任務,並且這個任務要求有返回結果!
* @author yangxj
* @date 2020/2/24 22:01
*/
public static void returnCompletableFuture() throws ExecutionException, InterruptedException {
CompletableFuture<Integer> integerCompletableFuture = CompletableFuture.supplyAsync(() -> {
System.out.println(Thread.currentThread().getName() + "有返回結果");
Integer result = 1024;
return result;
});
System.out.println(integerCompletableFuture.whenComplete((ok, error) -> {
System.out.println("===ok===" + ok); // 正常結果
System.out.println("===error===" + error); // 錯誤結果
}).exceptionally(e -> {// 異常!
System.out.println("getMessage=>" + e.getMessage());
return 555; // 異常返回結果
}).get());
}
}
程序運行結果如下:
設置程序異常情況:
package com.interview.concurrent.completablefuture;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
/**
* @author yangxj
* @description 描述
* CompletableFuture 異步回調, 對將來的結果進行結果,ajax就是一種異步回調!
* @date 2020/2/24 21:32
*/
public class CompletableFutureDemo {
public static void main(String[] args) throws Exception {
// 多線程也可以異步回調
returnCompletableFuture();
}
/**
* @description:有返回結果 ,功能像ajax。 成功或者失敗!
* 適用場景:
* 可異步執行的任務,並且這個任務要求有返回結果!
* @author yangxj
* @date 2020/2/24 22:01
*/
public static void returnCompletableFuture() throws ExecutionException, InterruptedException {
CompletableFuture<Integer> integerCompletableFuture = CompletableFuture.supplyAsync(() -> {
System.out.println(Thread.currentThread().getName() + "有返回結果");
int i = 10/0; //設置一個異常
Integer result = 1024;
return result;
});
System.out.println(integerCompletableFuture.whenComplete((ok, error) -> {
System.out.println("===ok===" + ok); // 正常結果
System.out.println("===error===" + error); // 錯誤結果
}).exceptionally(e -> {// 異常!
System.out.println("getMessage=>" + e.getMessage());
return 555; // 異常返回結果
}).get());
}
}
程序運行結果如下: