2016-08-03 5 views
17

Ich habe mich bemüht, aber keinen Artikel oder Blog gefunden, der "listenablefuture" und "completablefuture" klar vergleicht und eine gute Analyse derselben liefert. Wenn mir also jemand einen solchen Blog oder Artikel erklären oder zeigen kann, wird es mir wirklich gut tun. DankeListenablefuture vs Completablefuture

Antwort

17

Sowohl ListenableFuture als auch CompletableFuture haben einen Vorteil gegenüber der Elternklasse Future, indem sie dem Anrufer erlauben, auf die eine oder andere Weise einen Callback zu "registrieren", wenn die Async-Aktion abgeschlossen ist.

Mit Zukunft Sie können dies tun:

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

f.get() blockiert, bis die Asynchron-Aktion abgeschlossen ist;

Mit ListenableFuture Sie einen Rückruf wie folgt anmelden:

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

Mit CompletableFuture Sie auch einen Rückruf für, wenn die Aufgabe abgeschlossen registrieren kann, aber es unterscheidet sich von ListenableFuture dass es kann von jedem Thread abgeschlossen werden, der es vervollständigen möchte.

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

Wenn ein Thread auf der Aufgabe abgeschlossen ruft erhielt der Wert von einem Anruf zu erhalten() mit dem Parameterwert gesetzt, wenn die Aufgabe nicht bereits abgeschlossen ist.

Read about CompletableFuture

+1

Mit anderen Worten ... ist ListenableFuture eine gut durchdachte saubere Schnittstelle, während CompletableFuture (und die CompletionStag Schnittstelle, da es 'toCompletableFuture' aussetzt) ​​gefährlich ist, weil es' complete' Methoden verfügbar macht. Ein weiteres Beispiel für den nicht sehr gut durchdachten Müll, den wir von Oracle erwarten. –

+0

'CompletionStage' wäre gut gewesen, wenn es' Future' erweitert und '' ComplectableFuture' 'nicht exponiert hätte. Und dann hätten sie dann etwas Sinnvolles nennen können, wie "ChainableFuture". –

+2

'Future' und' ListenableFuture' sind Schnittstellen, während 'CompletableFuture' eine Klasse ist, die' Future' implementiert – cozyconemotel

Verwandte Themen