นากมิ้นต์ต้นฉบับวางนาฬิกาทรายสีอำพันข้างกล่องงาน ถ้าหมดเวลาจะสลับใส่กล่องสำรองแทน

Java completeOnTimeout: ใส่ค่าสำรองเมื่องานช้าเกินเวลา

น้องกายEngineering

orTimeout ทำให้ future ล้มด้วย TimeoutException แต่บางครั้งผมอยากได้ค่าสำรองแทนการโยน error ครับ completeOnTimeout(value, timeout, unit) จะเติมค่านั้นเมื่อครบเวลา ถ้างานจริงเสร็จก่อน ค่าจริงชนะ

WHY: API ที่ช้าไม่ควรทำให้ทั้งท่อพัง

ใช้กับเรียกบริการภายนอกที่พอมีค่าเริ่มต้นให้แสดงชั่วคราวได้ เช่น ค่าคอนฟิกเก่าหรือผลว่าง ระวังว่าการ complete ฝั่ง timeout ไม่ได้ยกเลิกงานพื้นหลังให้อัตโนมัติ — ต้องออกแบบยกเลิกเองถ้าต้องการประหยัดทรัพยากร

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

public class Main {
  public static void main(String[] args) throws Exception {
    CompletableFuture<String> slow = new CompletableFuture<>();
    slow.completeOnTimeout("fallback", 50, TimeUnit.MILLISECONDS);
    assert "fallback".equals(slow.get(1, TimeUnit.SECONDS));

    CompletableFuture<String> fast = new CompletableFuture<>();
    fast.completeOnTimeout("fallback", 200, TimeUnit.MILLISECONDS);
    fast.complete("real");
    assert "real".equals(fast.get(1, TimeUnit.SECONDS));
    System.out.println("ok");
  }
}

Recap

  • completeOnTimeout ใส่ค่าสำรองเมื่อหมดเวลา
  • ค่าที่ complete ก่อนชนะ
  • งานพื้นหลังอาจยังรันต่อ — วางแผนยกเลิกแยกถ้าจำเป็น