logo

CompletableFuture nedir?

A TamamlanabilirGelecek Asenkron programlama için kullanılır. Asenkron programlama, engellemeyen kod yazmak anlamına gelir. Bir görevi ana uygulama iş parçacığından ayrı bir iş parçacığında çalıştırır ve ana iş parçacığını ilerlemesi, tamamlanması veya başarısızlığı hakkında bilgilendirir.

Bu şekilde ana iş parçacığı engellemez veya görevin tamamlanmasını beklemez. Diğer görevler paralel olarak yürütülür. Paralellik programın performansını artırır.

CompletableFuture, Java'daki bir sınıftır. Java.util.cocurrent paketine aittir. CompletionStage ve Future arayüzünü uygular.

Tamamlama Aşaması

  • Bir eylemi gerçekleştirir ve başka bir tamamlama aşaması tamamlandığında bir değer döndürür.
  • Bir görevin diğer görevleri tetikleyebilecek modeli.

Dolayısıyla bir zincirin unsurudur.

Birden fazla iş parçacığı tamamlamaya çalıştığında (istisnai olarak tamamlama veya CompletableFuture'ı iptal etme), bunlardan yalnızca biri başarılı olur.

git ekle --tümü

Gelecek ve Tamamlanabilir Gelecek

CompletableFuture, Java 8'de tanıtılan Java'nın Future API'sinin bir uzantısıdır.

Eşzamansız Programlama için bir Gelecek kullanılır. İki yöntem sağlar, isDone() ve get(). Yöntemler, tamamlandığında hesaplamanın sonucunu alır.

Geleceğin Sınırlamaları

  • Bir Gelecek karşılıklı olarak tamamlanamaz.
  • Engelleme olmadan bir Geleceğin sonucu üzerinde daha fazla işlem yapamayız.
  • Geleceğin herhangi bir istisna işlemesi yoktur.
  • Birden fazla geleceği birleştiremeyiz.

Geleceğin pek çok sınırlaması var, bu yüzden CompletableFuture'a sahibiz. CompletableFuture, birden fazla Vadeli İşlem oluşturmak, zincirlemek ve birleştirmek için geniş bir yöntem seti sağlar. Ayrıca kapsamlı istisna işleme desteğine de sahiptir.

Tamamlanabilir Bir Gelecek Yaratmak

CompletableFuture'ı yalnızca aşağıdaki bağımsız değişkensiz yapıcıyı kullanarak oluşturabiliriz.

 CompletableFuture CompletableFuture = new CompletableFuture(); 

Örnek

En sık kullanılan CompletableFuture yöntemleri şunlardır:

    SupplyAsync():Asenkron olarak işini tamamlar. Tedarikçinin sonucu, varsayılan olarak ForkJoinPool.commonPool() öğesindeki bir görev tarafından çalıştırılır. SupplyAsync() yöntemi, diğer yöntemleri uygulayabileceğimiz CompletableFuture değerini döndürür.sonraUygula():Yöntem, işlevi argüman olarak kabul eder. Bu aşama normal şekilde tamamlandığında yeni bir CompletableStage döndürür. Yeni aşama, sağlanan işlevin argümanı olarak kullanılır.katılmak():yöntem tamamlandığında sonuç değerini döndürür. Ayrıca istisnai bir şekilde tamamlanırsa bir CompletionException (işaretlenmeyen istisna) oluşturur.
 import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; public class CompletableFutureExample1 { public static void main(String[] args) { try { List list = Arrays.asList(5,9,14); list.stream().map(num->CompletableFuture.supplyAsync(()->getNumber(num))).map(CompletableFuture->CompletableFuture.thenApply(n- >n*n)).map(t->t.join()).forEach(s->System.out.println(s)); } catch (Exception e) { e.printStackTrace(); } } private static int getNumber(int a) { return a*a; } } 

Çıktı:

Java'da Tamamlanabilir Gelecek

CompletableFuture'ın İstisna İşlemeleri

Beş CF'yi temsil eden aşağıdaki şekli düşünün:

Java'da Tamamlanabilir Gelecek

Beş CF'nin yürütüldüğünü ve CF21'in bir istisna oluşturduğunu varsayalım, o zaman tüm bağlı CF'ler (CF31 ve CF41) hatalıdır. Bu demektir:

kylie jenner kaç yaşında
  • isCompletedExceptionally() yöntemine yapılan çağrı true değerini döndürür.
  • get() çağrısı, kök İstisnaya neden olan bir ExecutionException oluşturur.

Bir istisna dışında CF30'u oluşturduğumuz aşağıdaki şekli düşünün.

Java'da Tamamlanabilir Gelecek

CF21 normal şekilde çalıştığında CF30 sadece değeri iletir. Bir istisna ortaya çıkarsa, CF30 bunu ele alır ve CF31 için değer üretir.

Bir istisnayı ele almanın üç yöntemi vardır:

 public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);