일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- IntelliJ
- SpringMVC
- superBuilder
- CKA
- vuejs
- map
- 알고리즘
- builder-pattern
- CI
- Oracle
- Vue
- Di
- DevOps
- Kubernetes
- docker
- programmers
- 코딩테스트연습
- 뷰
- ORM
- Spring
- JPA
- hibernate
- java
- dabase
- 해시맵
- CI/CD
- cd
- k8s
- 자바
- 프로그래머스
Archives
- Today
- Total
문홍의 공부장
[Java] 비동기 작업에 사용되는 CompletableFuture 본문
반응형
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.
반응형
'개발 > Java' 카테고리의 다른 글
[Java] Querydsl @QueryProjection, transform() 을 활용하여 효율적으로 Result Handling 하기 (0) | 2024.01.28 |
---|---|
[Java] EntityListeners 를 활용하여 엔티티의 생명 주기에 따른 이벤트 처리하기 (JPA Entity Lifecycle Events) (1) | 2024.01.28 |
[Java] Shorten URL (단축 URL) 생성하기 (0) | 2023.07.19 |
[Java] BigDecimal 사용하기 (1) | 2023.06.18 |
헤더에는 왜 언더스코어를 쓰면 안되나요? (feat. 제 로컬에서는 되는데요) (0) | 2023.06.05 |