นาฬิกาจับเวลาคู่กับกล่อง future บนโต๊ะมิ้นต์

Java CompletableFuture.orTimeout: ตั้งเวลาตายให้งานอะซิงก์

น้องกายEngineering

เรียก API แล้วกลัวค้างทั้งเธรดใช่ไหมครับ — CompletableFuture.orTimeout(timeout, unit) (Java 9+) ช่วยตั้งเวลาตาย

สั้น ๆ:

  • ถ้างานไม่จบทัน จะ complete แบบ exception ด้วย TimeoutException
  • คู่ที่มักใช้ต่อคือ completeOnTimeout ถ้าอยากได้ค่า default แทนการโยน
  • ยังต้องออกแบบยกเลิกงานพื้นหลังเองถ้าต้องการหยุดจริง ๆ
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.ExecutionException;

public class Main {
    public static void main(String[] args) throws Exception {
        CompletableFuture<String> slow = new CompletableFuture<>();
        CompletableFuture<String> guarded = slow.orTimeout(50, TimeUnit.MILLISECONDS);
        try {
            guarded.get();
            throw new AssertionError("expected timeout");
        } catch (ExecutionException ex) {
            assert ex.getCause() instanceof TimeoutException : ex.getCause();
        }
        System.out.println("ok");
    }
}

Recap

  • ใส่ orTimeout กับ I/O ภายนอกที่อาจค้าง
  • จัดการ TimeoutException ให้ผู้ใช้เห็นข้อความชัด
  • ถ้าต้องการค่าสำรอง ดู completeOnTimeout