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