2016-08-03 29 views
17

Próbowałem mocno, ale nie znalazłem żadnego artykułu lub bloga, który wyraźnie porównuje "listenablefuture" i "completablefuture", i zapewnia dobrą analizę tego samego. Jeśli więc ktoś może mi wytłumaczyć lub wskazać taki blog lub artykuł, będzie to dla mnie naprawdę dobre. dziękiListenablefuture vs Completablefuture

Odpowiedz

17

Zarówno ListenableFuture, jak i CompletableFuture mają przewagę nad swoją klasą macierzystą Future, umożliwiając dzwoniącemu "zarejestrowanie" w ten czy inny sposób wywołania zwrotnego, które ma zostać wywołane, gdy akcja asynchroniczna została zakończona.

Z Future można to zrobić:

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

f.get() blokuje aż zostanie zakończona akcja asynchroniczny;

Z ListenableFuture można zarejestrować wywołania zwrotnego takiego:

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 
       } 
      }) 

Z CompletableFuture można również zarejestrować wywołania zwrotnego dla kiedy zadanie jest kompletna, ale różni się ona od ListenableFuture tym, że można ukończyć z dowolnego wątku, który chce go ukończyć.

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()) 

Gdy wątek wywołuje kompletny na zadaniu, wartość otrzymanych z wywołania get() jest ustawiona z wartością parametru jeśli zadanie nie zostało jeszcze zakończone.

Read about CompletableFuture

+1

Innymi słowy ... ListenableFuture jest dobrze przemyślane przejrzysty interfejs, a CompletableFuture (a interfejs CompletionStage ponieważ naraża 'toCompletableFuture') jest niebezpieczne, ponieważ naraża' metody complete'. Jeszcze jeden przykład niezbyt dobrze przemyślanych śmieci, jakich oczekujemy od Oracle. –

+0

'CompletionStage' byłoby dobrze, gdyby rozszerzyło' Future' i nie naraziło 'toCompletableFuture'. A potem mogliby nazwać to czymś znaczącym, np. "ChainableFuture". –

+2

'Future' i' ListenableFuture' to interfejsy, podczas gdy 'CompletableFuture' to klasa implementująca' Future' – cozyconemotel