Khám phá triển khai thời gian chờ không đồng bộ JavaCompletableFuture
In lạiTác giả: Tôi là chú chim nhỏThời gian cập nhật: 2023-02-08 22:31:31264
Tác giả: Zhang Tianci của JD Technology.
Lời nói đầu
JDK 8 là bản nâng cấp phiên bản chính bổ sung nhiều tính năng mới, một trong số đó là CompleteableFuture. Kể từ đó, mô hình lập trình không đồng bộ dựa trên sự kiện đã thực sự được hỗ trợ ở cấp JDK, bù đắp cho những thiếu sót của Future.
Trong tối ưu hóa hàng ngày của chúng tôi, phương pháp được sử dụng phổ biến nhất là thực thi song song đa luồng. Lần này sẽ liên quan đến việc sử dụng CompleteableFuture.
Cách sử dụng phổ biến
Đây là một ví dụ về một kịch bản phổ biến.
Nếu chúng ta có hai dịch vụ cuộc gọi từ xa RPC, chúng ta cần lấy kết quả của hai RPC trước khi thực hiện xử lý logic tiếp theo.
public static void main(String[] args) { // Nhiệm vụ A, mất 2 giây int resultA = tính toán (1); // Nhiệm vụ B, mất 2 giây int resultB = tính toán (2); Hệ thống xử lý logic nghiệp vụ tiếp theo .out.println(kết quảA + kết quảB }
Có thể ước tính rằng quá trình thực hiện nối tiếp sẽ mất ít nhất 4 giây và tác vụ B không phụ thuộc vào kết quả của tác vụ A.
Đối với kịch bản này, chúng tôi thường chọn tối ưu hóa song song. Mã Demo như sau:
public static void main(String[] args) { // Chỉ là một ví dụ đơn giản, đừng viết như thế này trong mã sản xuất! // Hàm tốn thời gian time(() -> { CompleteableFuture result = Stream.of(1, 2) // Tạo một task.map(x -> CompletableFuture.supplyAsync(() -> Calculate(x) không đồng bộ ), executor)) // Aggregation.reduce(CompletableFuture.completedFuture(0), (x, y) -> x.thenCombineAsync(y, Integer::sum, executor)); // Đợi kết quả thử { System.out.println("Result: " + result.get()); } Catch (ExecutionException | InterruptedException e) { System.err.println( "Ngoại lệ thực thi tác vụ"); } }); } Đầu ra: [async-1]: Đã bắt đầu thực hiện tác vụ: 1 [async-2]: Đã bắt đầu thực hiện tác vụ: 2 [async-1]: Đã hoàn thành thực hiện tác vụ: 1 [async-2]: Đã hoàn thành thực hiện tác vụ: 2 Kết quả: 3 Thời gian đã trôi qua: 2 giây
Bạn có thể thấy rằng thời gian thực hiện đã trở thành 2 giây.
Vấn đề
phân tích
Có vẻ như các chức năng hiện có của CompleteableFuture có thể đáp ứng được nhu cầu của chúng tôi. Nhưng khi chúng tôi giới thiệu một số tình huống thực tế phổ biến, một số khuyết điểm tiềm ẩn sẽ bộc lộ.
Tôi là một lập trình viên xuất sắc, rất giỏi!