20 Kasım 2018 Salı

CompletableFuture Sınıfı

Giriş
Sınıf şöyledir. T parametresi döndürülen tiptir. Bu sınıfta çok fazla metod var !
CompletableFuture<T> implements CompletionStage<T>, implements Future<T>
Bu sınıf iki arayüzü gerçekleştirir. Temel olarak hem ForkJoin Thread Pool içinde iş çalıştırabilmeyi hem de ExecutorService'e iş olarak verilebilmeyi sağlar.

Kalıtım
1. CompletionStage
2. Future

CompletionStage için açıklama şöyle.
Since the CompletableFuture class implements the CompletionStage interface, we first need to understand the contract of that interface. It represents a stage of a certain computation which can be done either synchronously or asynchronously. You can think of it as just a single unit of a pipeline of computations that ultimately generates a final result of interest. This means that several CompletionStages can be chained together so that one stage’s completion triggers the execution of another stage, which in turn triggers another, and so on.
Future için açıklama şöyle.
In addition to implementing the CompletionStage interface, CompletableFuture also implements Future, which represents a pending asynchronous event, with the ability to explicitly complete this Future, hence the name CompletableFuture.
Yeni Stage Başlatan Metodlar
Açıklaması şöyle
- if a method name has fragment “then“, then the new stage starts after completion of a single previous stage
- if a method name has fragment “either“, then the new stage starts after completion of the first of two previous stages
- if a method name has fragment “both“, then the new stage starts after completion of both of two previous stages
Stage İçinde Ne Yapıldığını Anlatan Metodlar
Açıklaması şöyle
- if a method name has fragment “apply“, then the new stage transforms an argument by the given Function
- if a method name has fragment “accept“, then the new stage consumes an argument by the given Consumer
- if a method name has fragment “run“, then the new stage runs an action by the given Runnable
- thenAccept X() metodları bir future nesnesinin sonucunu sadece consume eder. Yani void döner.
- thenCombineX() metodları iki tane future nesnesinin sonuçlarını birleştirmek içindir
- thenApplyX() metodları bir future nesnesinin sonucunu alıp kullanarak başka bir sonuç döner.

Yeni CompletionStageYaratan Metodlar
newIncompleteFuture(), supplyAsync(), runAsnyc()i completedFuture(), failedFuture() kullanılabilir

Bulk Metodlar
allOf(), anyOf() gibi metodlar bulk çalışırlar

Complete İçin Metodlar
complete(), completeAsync()i completeOnTimeout(), completeExceptionally(), cancel() kullanılabilir

Bittiğini Anlamak İçin Metodlar
isDone(), isCompletedExceptionally(), isCancelled() gibi metodlar kullanılır

Sonuç Okumak İçin Metodlar
Bittikten sonra sonucu okumak gerekir. 
get(), join(), get(timeout,timeunit), getnow() gibi metodlar kullanılır

constructor
Örnek
Şöyle yaparız.
CompletableFuture<String> f = new CompletableFuture<>();
Örnek
Şöyle yaparız
public Future<String> calculateAsync() throws InterruptedException {
  CompletableFuture<String> completableFuture = new CompletableFuture<>();

  Executors.newCachedThreadPool().submit(() -> {
    Thread.sleep(500);
    completableFuture.complete("Hello");
    return null;
  });
  return completableFuture;
}
acceptEither metodu
Girdi olarak ya kendi sonucumu ya da parametre olarak verilen CompletionStage nesnesinin sonucunu alır.

allOf metodu
CompletableFuture.allOf metodu yazısına taşıdım.

anyOf metodu
CompletableFuture.anyOf metodu yazısına taşıdım.

applyToEither metodu
ompletableFuture.applyToEither metodu yazısına taşıdım.

cancel metodu
Açıklaması şöyle.  Future cancel() edildikten sonra get() metodunu çağırmak CancellationException fırlatılmasına sebep olur
Very close to exceptional completion, we can cancel a computation via the cancel(boolean mayInterruptIfRunning) method from the Future interface. For CompletableFuture, the boolean parameter is not used because the implementation does not employ interrupts to do the cancelation. Instead, cancel() is equivalent to completeExceptionally(new CancellationException()).
Bu metodun bir eksikliğinin açıklaması şöyle.
CompletableFuture.cancel()method does not interrupt underlying thread; it merely puts future to an exceptionally completed state. So even if you use any blocking calls inside functions passed to thenApplyAsync/ thenAcceptAsync/ etc., these functions will run until the end and will never be interrupted.
complete metodu
CompletableFuture.complete metodu yazısına taşıdım

completedFuture metodu
CompletableFuture.completedFuture metodu yazısına taşıdım

completeExceptionally metodu
Açıklaması şöyle.
explicitly complete the stage with an exception.
copy metodu
Örnek ver

exceptionally metodu

get metodu
CompletableFuture.get metodu yazısına taşıdım.

handle metodu
CompletableFuture.handle metodu yazısına taşıdım.

handleAsync metodu
Şöyle yaparız
f.handleAsync(biFunc, Executors.newFixedThreadPool(4)); // e.g. called with a fixed 
                                                        // thread pool of 4
isDone()
returns trues if the CompletableFutre is completed in any mannrer: normally, exceptionally, or by cancellation
isCompletedExceptionally()
returns true is this CompletableFuture is completed exceptionally, including cancellation
isCancelled()
returns true is this CompletableFuture is cancelled before it completed normally
join metodu

İmzası şöyle.
public T join()
get() metodundan farklı olarak try-catch yazmak zorunda kalmayız. Şöyle yaparız.
CompletableFuture<List<String>> cf = CompletableFuture
  .supplyAsync(this::process)
  .exceptionally(this::getFallbackListOfStrings) // catch join's CompletionException
  .thenAccept(this::processFurther);

getNow metodu
Future arayüzündeki get() metoduna benzer bir kullanım sağlar. Farklı olarak hemen döner.

orTimeout metodu
CompletableFuture.orTimeout metodu yazısına taşıdım

runAfterBoth metodu
Açıklaması şöyle.
Instead of executing a Runnable upon completion of both stages, using BiConsumer allows processing of their results
runAsync metodu - Runnable
CompletableFuture.runAsync metodu yazısına taşıdım.

runAsync metodu - Runnable + Executor
CompletableFuture.runAsync metodu yazısına taşıdım.

supplyAsync metodu - Supplier
CompletableFuture.supplyAsync metodu yazısına taşıdım.

supplyAsync metodu - Supplier + Executor
CompletableFuture.supplyAsync metodu yazısına taşıdım.

thenAccept metodu
CompletableFuture.thenAccept metodu yazısına taşıdım.

thenAcceptAsync metodu
CompletableFuture.thenAccept metodu yazısına taşıdım.

thenAcceptBoth metodu
CompletableFuture.thenAcceptBoth metodu yazısına taşıdım.

thenApply metodu - Allows the Return Type To Be Modified and Returned
CompletableFuture.thenApply metodu yazısına taşıdım.

thenApplyAsync metodu
CompletableFuture.thenApply metodu yazısına taşıdım.

thenApplyAsync metodu - Executor
CompletableFuture.thenApply metodu yazısına taşıdım.

thenCombine metodu - İki Future Bittikten Sonra Sonuçlarını Alıp Birleştirir

thenCombineAsync metodu - Executor
Örnek
Şöyle yaparız
CompletableFuture<X> future1 = ...
CompletableFuture<X> future2 = ...
CompletableFuture future3 = future1.thenCombineAsync(future2, futureCallback, executor);
thenCompose metodu - Nested CompletableFuture Sonuçlarını Düzleştirir
thenCompose metodu yazısına taşıdım.

toCompletableFuture metodu
Şöyle yaparız.
CompletionStage<List<String>> cacheFuture = ...;

return cacheFuture.thenCompose((List<String> userList) -> {
  ...
}).toCompletableFuture(); //convert `CompletionStage` to `CompletableFuture`
whenComplete metodu
CompletableFuture.whenComplete metodu yazısına taşıdım



Hiç yorum yok:

Yorum Gönder