앞으로 Java 8 이후의 버전들의 추가된 기능들을 공부하면서 정리를 해볼 생각이다. 간단한 내용이라도 블로그에 정리를 하게 되면 머리 속에 남는 내용이 많고, 나중에 버전별로 찾아보기 쉬울 것 같아서다.
Java 9에 추가된 기능부터 보게 될 텐데 다음 블로그에 Java 9 의 추가사항을 잘 정리해 주어서 그 내용을 바탕으로 하나씩 세부 내용을 정리해 보고자 한다.
순서대로 하지는 않을 것이고 궁금해서 보게 된 순으로 정리를 하게 될 것 같다.
예전 블로그 글을 통해서 비동기 처리를 위한 CompletableFuture를 소개한 적이 있다. Java 9 에서는 CompletableFuture의 기능을 보완한 부분이 있다. 가장 주요한 변화는 실행 시간의 지연과 타임아웃을 넣을 수 있는 부분이다.
먼저 타임아웃을 살펴보자.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static void main(String[] args) throws InterruptedException, ExecutionException { | |
int timeout = 3; | |
CompletableFuture<String> future = | |
doWork("JavaSampleApproach") | |
.orTimeout(timeout, TimeUnit.SECONDS) | |
.whenComplete((result, error) -> { | |
if (error == null) { | |
System.out.println("The result is: " + result); | |
} else { | |
System.out.println("Sorry, timeout in " + timeout + " seconds."); | |
} | |
}); | |
String content = future.get(); | |
System.out.println("Result >> " + content); | |
} | |
private static CompletableFuture<String> doWork(String s) { | |
return CompletableFuture.supplyAsync(() -> { | |
for (int i = 1; i <= 5; i++) { | |
try { | |
TimeUnit.SECONDS.sleep(1); | |
} catch (InterruptedException e) { | |
e.printStackTrace(); | |
} | |
System.out.println("running inside doWork()... " + i + "s"); | |
} | |
return s + " out!!"; | |
}); | |
} |
함수의 구조는 다음과 같이 간단하다.
public CompletableFuture<T> orTimeout(long timeout, TimeUnit unit)
두번째는 지연 실행이다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
long start = System.nanoTime(); | |
int a = 2; | |
int b = 5; | |
CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> a + b, | |
CompletableFuture.delayedExecutor(2, TimeUnit.SECONDS)) | |
.thenAccept(result -> System.out.println("result: " + result)); | |
future.get(); | |
System.out.println("duration: " + TimeUnit.SECONDS.convert(System.nanoTime() - start, TimeUnit.NANOSECONDS)); |
예제에서는 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 |