Java8 CompletableFuture handle
- 一、handle的作用和特點
-
- 1. handle的特點
- 2. handle和thenApply的差別
- 3. handle和whenComplete的差別
- 二、測試案例
一、handle的作用和特點
1. handle的特點
在寫代碼時,我們常用try…catch…finally這樣的代碼塊處理異常。
而handle就像finally,不論正常傳回還是出異常都會進入handle,類似whenComplete。
handle()一般接收new BiFunction<T, Throwable, R>();
- T:就是任務傳入的對象類型
- Throwable:就是任務傳入的異常
- R:就是handle自己傳回的對象類型
2. handle和thenApply的差別
handle和thenApply的差別:
- thenApply:任務出現異常就不會進入thenApply
- handle:任務出現異常也會進入handle,可對異常處理
3. handle和whenComplete的差別
handle和whenComplete的差別:
- handle對傳入值進行轉換,并産生自己的傳回結果,T -> R
- whenComplete的傳回值和上級任務傳入的結果一緻,不能對其轉換
二、測試案例
- supplyAsync中線程傳回的是部門Dept
- handle接收到傳入的Dept,并User指派deptId和deptName,然後傳回User
public class Thread04_Handle {
public static void main(String[] args) throws ExecutionException, InterruptedException {
DeptService deptService = new DeptService();
UserService userService = new UserService();
CompletableFuture<User> future = CompletableFuture
.supplyAsync(() -> {
//int a = 1 / 0;//如果出現異常,那麼thenApply則不執行
return deptService.getById(1);
}
)
.handle(new BiFunction<Dept, Throwable, User>() {
@Override
public User apply(Dept dept, Throwable throwable) {
if (throwable != null){
System.out.println(throwable.getMessage());
return null;
} else {
User user = new User(1, "winter", 32, dept.getId(), dept.getName());
return userService.save(user);
}
}
}
);
System.out.println("線程:" + Thread.currentThread().getName() +
" 結果:" + future.get());
}
}
從結果看,get()擷取到了handle的傳回值:包含部門資訊的人員對象
線程:ForkJoinPool.commonPool-worker-1 Dept.getById(1)
線程:main User.save(),User(id=1, name=winter, age=32, deptId=1, deptName=研發一部)
線程:main 結果:User(id=1, name=winter, age=32, deptId=1, deptName=研發一部)
如果加上int a = 1 / 0,肯定會報異常,在handle中設定了如果throwable != null,則傳回null。
java.lang.ArithmeticException: / by zero
線程:main 結果:null