반응형
CompletableFuture
public class CFuture {
public static void main(String\[\] args) throws ExecutionException, InterruptedException {
CompletableFuture f = new CompletableFuture<>();
f.completeExceptionally(new RuntimeException());
//System.out.println(f.get()); - 예외 발생
}
}
백그라운드에서 돌아가는 새로운 Thread 생성하기
- CompletionStage Class
하나의 비동기 작업을 수행하고 완료됐을 때 의존적으로 다른 작업 수행할 수 있도록 하는 클래스이다. CompletableFuture가 상속받기때문에 이를 활용가능하다. 또한, 체이닝 형태로 표현이 가능하다.
CompletableFuture
.runAsync(() -> log.info("runAsync"))
.thenRun(()->log.info("thenRunAsync"))
.thenRun(()->log.info("thenRunAsync"));
thenApply, thenCompose, exceptionally
thenApply
stream의 map과 같은 느낌.
thenCompose
반환 시, CompletionStage 타입으로만 변환을 해야한다. stream의 flatmap과 같은 느낌.
exceptionally
앞 메서드들에서 exception이 발생하면 한꺼번에 이 메서드에서 처리하도록 한다.
@Slf4j
public class CFuture {
public static void main(String[] args) throws ExecutionException, InterruptedException {
CompletableFuture
.supplyAsync(() -> {
log.info("runAsync");
if(1==1) throw new RuntimeException();
return 1;
})
.thenCompose(s -> {
log.info("thenRun {}", s);
return CompletableFuture.completedFuture(s + 1);
})
.thenApply(s2 -> {
log.info("thenRun {}", s2);
return s2 * 3;
})
.exceptionally(e -> -10)
.thenAccept(s3 -> log.info("thenRun {}", s3));
log.info("exit");
ForkJoinPool.commonPool().shutdown();
ForkJoinPool.commonPool().awaitTermination(10, TimeUnit.SECONDS);
}
}
반응형
'Spring' 카테고리의 다른 글
[Spring] Transactional 어노테이션 이해 및 사용하기 (0) | 2021.08.03 |
---|---|
[Spring] WebFlux - Mono의 동작방식과 block() (0) | 2021.03.01 |
[Spring] 스프링의 비동기 기술 (4) | 2021.02.17 |
[Java] 비동기 기초 Future, Callback (0) | 2021.02.10 |
[Spring] Reactive Programming 리액티브 프로그래밍 - Reactive Steams (2) | 2021.02.10 |
댓글