天天看點

Java8 CompletableFuture(5)異常處理 handle一、handle的作用和特點二、測試案例

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
           

繼續閱讀