Cả hai phương thức orTimeout() và completeOnTimeout() được định nghĩa trong lớp CompletableFuture và được giới thiệu trong Java 9. orTimeout() chỉ định nếu task không hoàn thành trong thời gian nhất định, chương trình dừng và ném TimeoutException; completeOnTimeout() hoàn thành CompletableFuture với giá trị cung cấp nếu chưa hoàn thành trước timeout.
Cú pháp orTimeout()
public CompletableFuture<T> orTimeout(long timeout, TimeUnit unit)
Ví dụ
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);
}
}
Kết quả
25 java.util.concurrent.TimeoutException
Cú pháp completeOnTimeout()
public CompletableFuture<T> completeOnTimeout(T value, long timeout, TimeUnit unit)
Ví dụ
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);
}
}
Kết quả
0
Lưu ý: Ví dụ gốc có kết quả 25 nhưng logic completeOnTimeout(0,...) sẽ trả về giá trị mặc định 0 khi timeout, không phải kết quả thực tế 25.