Tôi đã gặp phải hành vi lạ của phương thức Java 8 CompletableFuture thenCompose. Tôi có hai xét nghiệm chỉ khác nhau theo thứ tự thực hiện. Cả hai bài kiểm tra mô phỏng thất bại trong CompletableFuture được tạo ra trong đóSau đó.Tại sao Java 8 CompletableFuture rồiSửa đổi tạo ra ngoại lệ khác nhau tùy thuộc vào thứ tự hoàn thành?
@Test
public void completedAfter() {
CompletableFuture<String> future1 = new CompletableFuture<>();
CompletableFuture<String> future2 = new CompletableFuture<>();
future1.thenCompose(x -> future2).whenComplete((r, e) -> System.out.println("After: " + e));
future1.complete("value");
future2.completeExceptionally(new RuntimeException());
}
@Test
public void completedBefore() {
CompletableFuture<String> future1 = new CompletableFuture<>();
CompletableFuture<String> future2 = new CompletableFuture<>();
future1.complete("value");
future2.completeExceptionally(new RuntimeException());
future1.thenCompose(x -> future2).whenComplete((r, e) -> System.out.println("Before: " +e));
}
Đầu ra là:
After: java.util.concurrent.CompletionException: java.lang.RuntimeException
Before: java.lang.RuntimeException
Câu hỏi đặt ra là, tại sao là ngoại lệ được bọc trong CompletionException
trong một trường hợp nhưng không phải trong khác?
Cập nhật: Here là báo cáo lỗi liên quan. Nó đã được đánh dấu và giải quyết như một lỗi trong JDK.
Bạn đã nhìn ListenableFuture ổi không? Nếu bạn không bị khóa vào khung công tác, tôi khuyên bạn nên sử dụng thực hiện của ổi. Theo quan điểm hoàn toàn của tôi, đó là tính năng hoàn chỉnh và dễ sử dụng hơn nhiều. Disclamer, tôi không có cách nào liên kết với Google. –
Đã có rất nhiều lưu lượng truy cập trên Completablefuture trên danh sách sở thích đồng thời. Danh sách tháng 11 có thể khiến bạn quan tâm: http://cs.oswego.edu/pipermail/concurrency-interest/2014-November/subject.html – edharned