Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ความแตกต่างระหว่าง orTimeout() และ completeOnTimeout() ใน Java 9

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โยน TimeoutExceptionComplete ด้วย fallback value
ใช้เมื่อต้องการ fail-fastต้องการ default value / fallback
Exception handlingต้องจับใน whenComplete/handleไม่มี exception (complete ปกติ)

สรุป

  • orTimeout ใช้เมื่อ timeout ถือเป็น error
  • completeOnTimeout ใช้เมื่อ timeout ถือเป็น normal case และมีค่า default