Listenablefuture против Completablefuture

Я старался, но не нашел никакой статьи или блога, который четко сравнивает ListenableFuture и CompletableFuture, и обеспечивает хороший анализ.

поэтому, если кто-нибудь может объяснить или указать мне на такой блог или статью, это будет действительно хорошо для меня.

1 ответов


как ListenableFuture, так и CompletableFuture имеют преимущество перед своим родительским классом Future, позволяя вызывающему объекту так или иначе "регистрировать" обратный вызов, который будет вызван после завершения асинхронного действия.

С будущее можно сделать так:

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

f.get () блокирует до завершения асинхронного действия;

С ListenableFuture вы можете зарегистрировать обратный вызов следующим образом:

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

С CompletableFuture вы также можете зарегистрировать обратный вызов, когда задача завершена, но она отличается от ListenableFuture тем, что ее можно выполнить из любого потока, который хочет ее завершить.

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

когда поток вызывает завершение задачи, значение, полученное от вызова get (), устанавливается со значением параметра, если задача еще не завершена.

читайте о CompletableFuture