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
Şöyle yaparız.
Şöyle yaparız.
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
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.
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 + Executorstatic 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'ı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