Sobes.tech
Middle

CompletableFuture sinfinin konsepti haqqında danışın.

sobes.tech Süni İntellekt

AI-dan cavab

CompletableFuture Java 8+ sinifidir və FutureCompletionStage interfeyslerini həyata keçirir. Bu, gələcəkdə müəyyən bir zamanda tamamlanacaq (və ya səhv verəcək) asinxron hesablamanı təmsil edir və nəticə üzərində ardıcıl əməliyyatları deklarativ şəkildə yerinə yetirməyə imkan verir, əsas axını bloklamadan.

Əsas imkanlar:

  • Asinxron icra: Tapşırıqları ayrı bir iş parçacığında (və ya iş parçacığı hovuzunda) başlatmağa imkan verir.
  • Kompozisiya: Bir neçə CompletableFuture-u birləşdirərək asılı əməliyyat zəncirləri yarada bilərsiniz.
  • Xəta idarəetməsi: Asinxron hesablamalarda səhvləri idarə etmək üçün metodlar təqdim edir.
  • Bloklamadan əməliyyatlar: Nəticə və ya istisna, future tamamlandıqda, açıq şəkildə gözləmədən (get()) işlənir.

Əsas metodlar:

  • Yaradıcılıq:
    • supplyAsync(Supplier<T> supplier): Bir Supplier-ı asinxron şəkildə icra edir və onun nəticəsi ilə CompletableFuture qaytarır.
    • runAsync(Runnable runnable): Bir Runnable-ı asinxron şəkildə icra edir və CompletableFuture<Void> qaytarır.
    • completedFuture(T value): Artıq tamamlanmış, verilmiş dəyər ilə CompletableFuture yaradır.
  • Transformasiya:
    • thenApply(Function<T, U> fn): Nəticəyə funksiyanı tətbiq edir, zaman future tamamlanır.
    • thenAccept(Consumer<T> action): Nəticə tamamlandıqda bir əməliyyat yerinə yetirir.
    • thenRun(Runnable action): Nəticəni nəzərə almadan, tamamlandıqda əməliyyat yerinə yetirir.
    • thenCompose(Function<T, CompletionStage<U>> fn): Zəncirlər qurmağa imkan verir, burada bir future-un nəticəsi başqa birinin yaradılmasında istifadə olunur.
  • Birleştirme:
    • thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn): İki future-un nəticələrini birləşdirir.
    • allOf(CompletableFuture<?>... cfs): Verilən bütün future-lər tamamlandıqda tamamlanan CompletableFuture<Void> qaytarır.
    • anyOf(CompletableFuture<?>... cfs): Hər hansı biri tamamlandıqda tamamlanan CompletableFuture<Object> qaytarır.
  • Xəta idarəetməsi:
    • exceptionally(Function<Throwable, T> fn): Xətaları idarə edir və alternativ dəyər qaytarır.
    • handle(BiFunction<T, Throwable, U> fn): Həm nəticəni, həm də istisnayı idarə edir.

Nümunə:

// Asinxron tapşırıq başlat
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(1000); // Uzun işin simulyasiyası
    } catch (InterruptedException e) {
        throw new IllegalStateException(e);
    }
    return "Asinxron əməliyyatın nəticəsi";
});

// Tapşırıq tamamlandıqdan sonra əməliyyat yerinə yetir (bloklamadan)
future.thenAccept(result -> {
    System.out.println("Alınan nəticə: " + result);
});

// Bir digər əməliyyat, ilkindən asılı
future.thenApply(String::toUpperCase)
      .thenAccept(upperCaseResult -> {
          System.out.println("Böyük hərflərlə nəticə: " + upperCaseResult);
      });

// Bütün tapşırıqların tamamlanmasını gözləmək (əsl tətbiqlərdə adətən açıq `get/join` istifadə etməmək tövsiyə olunur)
// future.join();

CompletableFuture Java-da reaktiv və bloklamayan kod yazmaq üçün güclü bir vasitədir və asinxronluq ilə işləmək işini klassik Future-ə nisbətən əhəmiyyətli dərəcədə sadələşdirir.