나누고 싶은 개발 이야기

Data Engineer로서 기록하고 공유하고 싶은 기술들. 책과 함께 이야기합니다.

Language/Java

[Java9] CompletableFuture 지연 & 시간초과 개선

devidea 2019. 1. 28. 19:39
앞으로 Java 8 이후의 버전들의 추가된 기능들을 공부하면서 정리를 해볼 생각이다. 간단한 내용이라도 블로그에 정리를 하게 되면 머리 속에 남는 내용이 많고, 나중에 버전별로 찾아보기 쉬울 것 같아서다.

Java 9에 추가된 기능부터 보게 될 텐데 다음 블로그에 Java 9 의 추가사항을 잘 정리해 주어서 그 내용을 바탕으로 하나씩 세부 내용을 정리해 보고자 한다.
순서대로 하지는 않을 것이고 궁금해서 보게 된 순으로 정리를 하게 될 것 같다.

예전 블로그 글을 통해서 비동기 처리를 위한 CompletableFuture를 소개한 적이 있다. Java 9 에서는 CompletableFuture의 기능을 보완한 부분이 있다. 가장 주요한 변화는 실행 시간의 지연과 타임아웃을 넣을 수 있는 부분이다.

먼저 타임아웃을 살펴보자.

다음 코드에서 doWork 함수는 sleep으로 1초가 걸리는 작업을 5번 수행하게 된다. 그런데 3초가 넘게 될 때 타임아웃으로 Exception이 나오게 하면 어떻게 할까? Java 9에서는 orTimeout 함수가 추가되어서 파라미터로 넘긴 시간보다 넘게 비동기 처리를 할 때 Exception(java.util.concurrent.TimeoutException)이 나게 한다.

함수의 구조는 다음과 같이 간단하다.
public CompletableFuture<T> orTimeout(long timeout, TimeUnit unit)


두번째는 지연 실행이다.
동기 작업을 수행하도록 하는 간단한 내용이다. 그런데 중요한 부분은 2번째 파라미터인 Executor이다. ForkJoinPool에 있는 Thread를 사용하는게 아니라 다른 Excutor로 수행하도록 하는 걸 볼수 있다. 그때 CompletableFuture.delayedExecutor라는 새로운 함수가 Java 9에서 추가된 부분이다. 함수명 그래로 지연이 가능한 Executor를 생성해 주는 역할을 한다. 파라미터로 특정 시간을 입력 받으면 그 시간을 지나서 동작한다.

예제에서는 2초의 지연시간을 주었는데 future.get()으로 수행이 완료되기까지 기다린 다음에 그 시간 차이를 출력했다. 결과는 예상대로 delayedExecutor에서 설정한 2초가 나왔다. Java 9에서 추가된 기능을 통해서 비동기 처리의 시간과 관련된 설정을 변경해 가며 개발하는데 유용할 듯 보인다.


[참고문서]


반응형

'Language > Java' 카테고리의 다른 글

Proxy를 통한 Restful API 호출 by Java  (0) 2019.12.09
[Java8] yyyyMMddHHmmssSSS LocalDateTime parse 오류  (0) 2019.07.11
[Java8] sorted groupBy  (0) 2019.01.11
[multi thread] java.util.concurrent Part 1  (0) 2019.01.04
Dynamic Proxies  (0) 2017.08.29