20 Eylül 2018 Perşembe

CompletableFuture.supplyAsync metodu

Giriş
supplyAsync() metodları ile runAsynch() 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