개발/Java
[Java] 비동기 작업에 사용되는 CompletableFuture
moonong
2024. 3. 4. 23:04
반응형
CompletableFuture
는 기존의 Future
인터페이스의 한계를 보완하기 위해 등장한 클래스이다.
Future
인터페이스는 비동기 작업에 대한 결과값을 리턴받기 위해 사용되었으나, 아래와 같은 한계점이 존재한다.
- 외부에서 완료시킬 수 없고,
get(long timeout, TimeUnit unit)
의 timeout 설정으로만 완료 가능 - 블로킹 코드(
get()
) 을 통해서만 이후 결과를 처리할 수 있음 - 여러
Future
를 조합하거나, 예외 처리 할 수 없음
CompletableFuture
는 이름 그대로 외부에서 '완료 가능한' Future 이다. 또한, CompletionStage
인터페이스를 구현하여 작업의 중첩, 완료 후 콜백(Future 간 조합)을 가능하게 하였다.
public class CompletableFuture<T> implements Future<T>, CompletionStage<T> {
...
}
CompletableFuture가 갖는 작업의 종류는 크게 다음과 같이 구분할 수 있다.
- 비동기 작업 실행
- runAsync: 반환값이 없는 경우
- supplyAsync: 반환값이 있는 경우
- 작업 콜백
- thenApply
- 반환 값을 받아서 다른 값을 반환함
- 함수형 인터페이스 Function을 파라미터로 받음
- thenAccpet
- 반환 값을 받아 처리하고 값을 반환하지 않음
- 함수형 인터페이스 Consumer를 파라미터로 받음
- thenRun
- 반환 값을 받지 않고 다른 작업을 실행함
- 함수형 인터페이스 Runnable을 파라미터로 받음
- thenApply
- 작업 조합
- thenCompose
- 두 작업이 이어서 실행하도록 조합하며, 앞선 작업의 결과를 받아서 사용할 수 있음
- 함수형 인터페이스 Function을 파라미터로 받음
- thenCombine
- 두 작업을 독립적으로 실행하고, 둘 다 완료되었을 때 콜백을 실행함
- 함수형 인터페이스 Function을 파라미터로 받음
- allOf
- 여러 작업들을 동시에 실행하고, 모든 작업 결과에 콜백을 실행함
- anyOf
- 여러 작업들 중에서 가장 빨리 끝난 하나의 결과에 콜백을 실행함
- thenCompose
- 예외 처리
- exeptionally
- 발생한 에러를 받아서 예외를 처리함
- 함수형 인터페이스 Function을 파라미터로 받음
- handle, handleAsync
- (결과값, 에러)를 반환받아 에러가 발생한 경우와 아닌 경우 모두를 처리할 수 있음
- 함수형 인터페이스 BiFunction을 파라미터로 받음
- exeptionally
CompletableFuture
.runAsync(() -> doSomething(), taskExecutor)
.thenRun(() -> doSomething2())
.exceptionally(e -> { handleError(e);
return null;
});
References.
반응형