2016-08-03 13 views
17

Tôi đã cố gắng hết sức nhưng không tìm thấy bất kỳ bài viết hoặc blog nào so sánh rõ ràng "listenablefuture" và "completablefuture", và cung cấp một phân tích tốt như nhau. Vì vậy, nếu bất cứ ai có thể giải thích hoặc chỉ cho tôi một blog hoặc bài viết như vậy, nó sẽ thực sự tốt cho tôi. Cảm ơnListenablefuture vs Completablefuture

Trả lời

17

Cả ListenableFuture và CompletableFuture có lợi thế so với lớp cha mẹ Tương lai bằng cách cho phép người gọi "đăng ký" theo cách này hay cách khác gọi lại khi hành động không đồng bộ được hoàn thành.

Với Future bạn có thể làm điều này:

ExecutorService executor = ...; 
Future f = executor.submit(...); 
f.get(); 

f.get() khối cho đến khi hành động async được hoàn thành;

Với ListenableFuture bạn có thể đăng ký một callback như thế này:

ListenableFuture listenable = service.submit(...); 
    Futures.addCallback(listenable, new FutureCallback<Object>() { 
       @Override 
       public void onSuccess(Object o) { 
        //handle on success 
       } 

       @Override 
       public void onFailure(Throwable throwable) { 
        //handle on failure 
       } 
      }) 

Với CompletableFuture bạn cũng có thể đăng ký một callback khi nhiệm vụ hoàn tất, nhưng nó là khác nhau từ ListenableFuture ở chỗ nó có thể được hoàn thành từ bất kỳ chủ đề nào muốn hoàn thành.

CompletableFuture completableFuture = new CompletableFuture(); 
    completableFuture.whenComplete(new BiConsumer() { 
     @Override 
     public void accept(Object o, Object o2) { 
      //handle complete 
     } 
    }); // complete the task 
    completableFuture.complete(new Object()) 

Khi một chuỗi gọi hoàn thành nhiệm vụ, giá trị nhận được từ cuộc gọi đến get() được đặt bằng giá trị tham số nếu tác vụ chưa hoàn tất.

Read about CompletableFuture

+1

Nói cách khác ... ListenableFuture là cũng nghĩ ra giao diện sạch sẽ, trong khi CompletableFuture (và giao diện CompletionStage vì nó cho thấy 'toCompletableFuture') là nguy hiểm bởi vì nó cho thấy' phương pháp complete'. Tuy nhiên, một ví dụ khác về rác thải không được suy nghĩ rất tốt mà chúng tôi mong đợi từ Oracle. –

+0

'CompletionStage' sẽ tốt nếu nó mở rộng' Tương lai' và không hiển thị 'toCompletableFuture'. Và sau đó họ có thể đặt tên cho nó một cái gì đó có ý nghĩa, như "ChainableFuture". –

+2

'Tương lai' và' ListenableFuture' là các giao diện trong khi 'CompletableFuture' là một lớp thực hiện' Tương lai ' – cozyconemotel

Các vấn đề liên quan