Sobes.tech
Middle

CompletableFuture sinfining konsepti haqida gapiring.

sobes.tech AI

AIdan javob

CompletableFuture Java 8+ da sınıfı olup, Future ve CompletionStage arayüzlerini uygular. Bu, gelecekte bir noktada tamamlanabilecek (veya hata verebilecek) asenkron bir hesaplamayı temsil eder ve sonuç üzerinde ardışık işlemler, ana akışı engellemeden, deklaratif olarak gerçekleştirilebilir.

Ana özellikler:

  • Asenkron yürütme: Görevleri ayrı bir iş parçacığında (veya iş parçacığı havuzunda) başlatmaya olanak tanır.
  • Bileşim: Birden fazla CompletableFuture'yu birleştirerek bağımlı işlem zincirleri oluşturulabilir.
  • Hata yönetimi: Asenkron hesaplamalardaki hataları işlemek için metodlar sağlar.
  • Engellemeden işlemler: Sonuç veya hata, future tamamlandığında, açıkça beklemeden (get()) işlenir.

Ana metodlar:

  • Oluşturma:
    • supplyAsync(Supplier<T> supplier): Bir Supplier'ı asenkron olarak çalıştırır ve onun sonucu ile bir CompletableFuture döner.
    • runAsync(Runnable runnable): Bir Runnable'ı asenkron olarak çalıştırır ve CompletableFuture<Void> döner.
    • completedFuture(T value): Zaten tamamlanmış, belirli bir değerle oluşturulmuş bir CompletableFuture döner.
  • Dönüşüm:
    • thenApply(Function<T, U> fn): Future tamamlandığında fonksiyon uygular.
    • thenAccept(Consumer<T> action): Sonuç tamamlandığında bir işlem gerçekleştirir.
    • thenRun(Runnable action): Sonuç ne olursa olsun, tamamlandığında bir işlem yapar.
    • thenCompose(Function<T, CompletionStage<U>> fn): Zincirler oluşturmaya izin verir, burada bir future'un sonucu başka bir future'un oluşturulmasında kullanılır.
  • Kombinasyon:
    • thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn): İki future'un sonuçlarını birleştirir.
    • allOf(CompletableFuture<?>... cfs): Tüm verilen future'lar tamamlandığında tamamlanan CompletableFuture<Void> döner.
    • anyOf(CompletableFuture<?>... cfs): Herhangi biri tamamlandığında tamamlanan CompletableFuture<Object> döner.
  • Hata yönetimi:
    • exceptionally(Function<Throwable, T> fn): Hataları işler ve alternatif bir değer döner.
    • handle(BiFunction<T, Throwable, U> fn): Hem sonucu hem de hatayı işler.

Örnek:

// Asenkron görev başlatma
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(1000); // Uzun süren işlemin simülasyonu
    } catch (InterruptedException e) {
        throw new IllegalStateException(e);
    }
    return "Asenkron işlemin sonucu";
});

// Görev tamamlandıktan sonra işlem yapma (engellemeden)
future.thenAccept(result -> {
    System.out.println("Alınan sonuç: " + result);
});

// Bir diğer işlem, ilkine bağlı
future.thenApply(String::toUpperCase)
      .thenAccept(upperCaseResult -> {
          System.out.println("Büyük harfli sonuç: " + upperCaseResult);
      });

// Tüm görevlerin tamamlanmasını bekleme (gerçek uygulamalarda genellikle açıkça get/join kullanımı önlenir)
// future.join();

CompletableFuture, Java'da reaktif ve engellemeden çalışan kodlar yazmak için güçlü bir araçtır ve geleneksel Future arayüzüne kıyasla asenkron işlemlerle çalışma işini önemli ölçüde basitleştirir.