티스토리 뷰

[JAVA]

[java8] CompletableFuture 에러 처리

handr95 2019. 5. 23. 22:00
반응형
CompleCompletableFuture의 get(long timeout, TimeUnit unit) 메서드와 completeExceptionally() 메서드

 

Future의 실행 도중 Excpetion이 발생한다면 해당 스레드에만 영향을 미치게 된다.

 

즉, 예러가 발생하더라도 그 이후의 동작은 계속 진행이 되며 일의 순서가 꼬이게 된다.

 

클라이언트는 future.get 메서드가 반환될 때까지 영원히 기다릴수 있다.

 

아래의 예시와 같이 타임 아웃 값을 받는 get 메서드를 사용하면 블록 문제를 해결은 할수 있다.

try {
//결과가 준비되어있지 않으면 최대 1초간 블록한다.  
	Double result = futurePrice.get(1, TimeUnit.SECONDS);
} catch (InterruptedException e) {
	e.printStackTrace();    //future 수행 중 예외 발생
} catch (ExecutionException e) {
	e.printStackTrace();    //현재 스레드에서 대기 중 인터럽트 발생
} catch (TimeoutException e) {
	e.printStackTrace();    //Future가 완료되기 전에 타임아웃 발생
}

하지만 타임아웃 시간이 지나 TimeoutException이 발생하게 될경우 해당 예외가 왜 발생했는지는 알 수 없다.

 

 

따라서 completeExceptionally 메서드를 이용하여 CompletableFuture 내부에서 발생한 예외를 클라이언트에 전달해야 한다.

public Future<Double> getPriceAsync(String product) {
        CompletableFuture<Double> futurePrice = new CompletableFuture<>();
        new Thread(() -> {  //다른 스레드에서 비동기적으로 계산 수행
            try {
                double price = calculatePrice(product);
                futurePrice.complete(price);    //future에 값 설정
            } catch (Exception e) {
                futurePrice.completeExceptionally(e);   //exception이 발생하면 발생한 에러를 포함시켜 future 종료
            }
        }).start();
        return futurePrice; //계산 결과 기다리지 않고 바로 future 반환
}

 

 


참고

 

http://www.hanbit.co.kr/store/books/look.php?p_code=B1999551123

 

 


예제

https://github.com/handr95/java_study/tree/master/java8_study

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함