CompletableFuture Timeout Methods
Java 9 เพิ่มเมธอด timeout ให้ CompletableFuture 2 เมธอด:
1. orTimeout()
พฤติกรรม: ถ้า task ไม่เสร็จภายใน timeout -> โยน TimeoutException
Syntax
public CompletableFuture<T> orTimeout(long timeout, TimeUnit unit)
ตัวอย่าง
CompletableFuture.supplyAsync(() -> {
TimeUnit.SECONDS.sleep(5);
return a + b;
}).orTimeout(4, TimeUnit.SECONDS)
.whenComplete((result, exception) -> {
System.out.println(result);
if(exception != null) exception.printStackTrace();
});
Output
25 (แต่มี TimeoutException ใน exception)
2. completeOnTimeout()
พฤติกรรม: ถ้า task ไม่เสร็จภายใน timeout -> complete ด้วยค่าที่กำหนด (fallback value)
Syntax
public CompletableFuture<T> completeOnTimeout(T value, long timeout, TimeUnit unit)
ตัวอย่าง
CompletableFuture.supplyAsync(() -> {
TimeUnit.SECONDS.sleep(5);
return a + b;
}).completeOnTimeout(0, 4, TimeUnit.SECONDS)
.thenAccept(result -> System.out.println(result));
Output
0 (fallback value เพราะ timeout 4 วินาที task ใช้ 5 วินาที)
ตารางเปรียบเทียบ
| คุณสมบัติ | orTimeout() | completeOnTimeout() |
|---|---|---|
| เมื่อ Timeout | โยน TimeoutException | Complete ด้วย fallback value |
| ใช้เมื่อ | ต้องการ fail-fast | ต้องการ default value / fallback |
| Exception handling | ต้องจับใน whenComplete/handle | ไม่มี exception (complete ปกติ) |
สรุป
orTimeoutใช้เมื่อ timeout ถือเป็น errorcompleteOnTimeoutใช้เมื่อ timeout ถือเป็น normal case และมีค่า default