Java 9에서 도입된 orTimeout()과 completeOnTimeout() 메서드는 모두 CompletableFuture 클래스에 정의되어 있으며, 비동기 작업의 시간 초과를 처리하는 데 사용됩니다. 두 메서드의 핵심 차이점은 시간 초과가 발생했을 때의 동작 방식에 있습니다.
orTimeout() 메서드는 주어진 시간 내에 작업이 완료되지 않으면 TimeoutException을 발생시켜 CompletableFuture를 예외적으로 완료합니다. 반면 completeOnTimeout() 메서드는 시간 초과가 발생하면 미리 지정한 기본값으로 CompletableFuture를 정상적으로 완료합니다. 물론 작업이 지정된 시간 제한 이전에 완료되면 두 메서드 모두 실제 계산 결과를 반환합니다.
orTimeout() 메서드 문법
public CompletableFuture<T> orTimeout(long timeout, TimeUnit unit)
이 메서드는 지정한 시간 내에 CompletableFuture가 완료되지 않을 경우, TimeoutException으로 예외적으로 완료되도록 강제합니다. 시간 초과 시 작업이 실패하는 것이 자연스러운 상황에 적합합니다.
orTimeout() 사용 예제
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class OrTimeoutMethodTest {
public static void main(String args[]) throws InterruptedException {
int a = 10;
int b = 15;
CompletableFuture.supplyAsync(() -> {
try {
TimeUnit.SECONDS.sleep(5);
} catch(InterruptedException e) {
e.printStackTrace();
}
return a + b;
})
.orTimeout(4, TimeUnit.SECONDS)
.whenComplete((result, exception) -> {
System.out.println(result);
if(exception != null)
exception.printStackTrace();
});
TimeUnit.SECONDS.sleep(10);
}
}실행 결과
25
위 예제에서 비동기 작업은 5초가 소요되지만, orTimeout()으로 4초의 시간 제한을 설정했습니다. 이 예제에서는 작업이 시간 제한 내에 완료되어 정상적으로 결과 25가 출력됩니다. 만약 시간 제한이 작업 완료 시간보다 짧다면 TimeoutException이 발생합니다.
completeOnTimeout() 메서드 문법
public CompletableFuture<T> completeOnTimeout(T value, long timeout, TimeUnit unit)
이 메서드는 지정한 시간 내에 CompletableFuture가 완료되지 않을 경우, 전달된 기본값으로 정상적으로 완료됩니다. 시간 초과 시에도 프로그램이 계속 진행되어야 하는 상황에 유용합니다.
completeOnTimeout() 사용 예제
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class CompleteOnTimeOutMethodTest {
public static void main(String args[]) throws InterruptedException {
int a = 10;
int b = 15;
CompletableFuture.supplyAsync(() -> {
try {
TimeUnit.SECONDS.sleep(5);
} catch(InterruptedException e) {
e.printStackTrace();
}
return a + b;
})
.completeOnTimeout(0, 4, TimeUnit.SECONDS)
.thenAccept(result -> System.out.println(result));
TimeUnit.SECONDS.sleep(10);
}
}실행 결과
25
두 메서드의 주요 차이점 요약
- orTimeout(): 시간 초과 발생 시 TimeoutException을 던지며 CompletableFuture를 예외적으로 완료합니다.
- completeOnTimeout(): 시간 초과 발생 시 지정한 기본값으로 CompletableFuture를 정상적으로 완료합니다.
- 두 메서드 모두 작업이 시간 제한 내에 완료되면 실제 계산 결과를 그대로 반환합니다.
따라서 시간 초과를 오류로 간주해야 하는 경우에는 orTimeout()을, 기본값으로 우아하게 대체 처리해야 하는 경우에는 completeOnTimeout()을 사용하는 것이 좋습니다.