1 Ocak 2020 Çarşamba

CompletableFuture.supplyAsync metodu - Belirtilen Supplier'ı Çalıştırır

Giriş
Açıklaması şöyle
The method CompletableFuture.supplyAsync gets a thread from ForkJoinPool#commonPool(), and executes the lambda function in that thread.
supplyAsync() metodları ile runAsync() metodları kardeş. Birisi girdi olarak Supplier alırken, diğeri Runnable alıyor.

supplyAsync metodu - Supplier
Belirtilen işi ForkJoinPool içinde çalıştırır ve bir sonuç döner.
static Factory metodudur. Supplier sonuç döneceği için dönüş tipi vardır. ExecutorService.submit metodunu çağırmak gibidir yani işi çalıştırılması için bir ForkJoinPool 'a teslim eder. Metodun imzası şöyle
CompletableFuture<U> supplyAsync(Supplier<U> supplier)
Örnek
Şöyle yaparız.
CompletableFuture<String> f = CompletableFuture.supplyAsync(() -> "1234");
Örnek
Şöyle yaparız.
public CompletableFuture<String> asyncLongProcess(HttpServletRequest request) {
  HttpSession session = request.getSession();
  return CompletableFuture.supplyAsync(() -> session.getAttribute("CACHED_RESULT"))
    .thenComposeAsync(obj -> {
      if (obj == null) {
        if(session.getAttribute("BACKGROUND_PROCESSING") == null) {
          session.setAttribute("BACKGROUND_PROCESSING", true);
          CompletableFuture.supplyAsync(() -> callURL(response, request))
            .thenAccept(result -> session.setAttribute("CACHED_RESULT", result));
        }
        return CompletableFuture.completedFuture("Still Processing");
      }

      return CompletableFuture.completedFuture(obj.toString());
  });
}
supplyAsync metodu - Supplier + Executor
static Factory metodudur. Supplier sonuç döneceği için dönüş tipi vardır. ExecutorService.submit metodunu çağırmak gibidir yani işi çalıştırılması için belirtilen ThreadPool'a teslim eder. Örnek ver

Diğer

thenApply ile Kullanımı
thenApply'ın hangi thread içinde çalışacağı garanti değil. supplyAsync() thread'i içinde de olabilir veya thenApply() çağrısnı yapan thread içinde olabilir.

Örnek
Elimizde şöyle bir kod olsun.
public static void main(String... args) throws ExecutionException, InterruptedException {
  final CompletableFuture<Integer> future = CompletableFuture
    .supplyAsync(() -> doSomethingAndReturnA())
    .thenApply(a -> convertToB(a));

    future.get();
}
Eğer doSomethingAndReturnA uzun sürerse çıktı olarak şunu alırız.
doSomethingAndReturnA: ForkJoinPool.commonPool-worker-1
convertToB: ForkJoinPool.commonPool-worker-1
Eğer kısa sürerse çıktı olarak şunu alırız.
doSomethingAndReturnA: ForkJoinPool.commonPool-worker-1
convertToB: main



Hiç yorum yok:

Yorum Gönder