0Pricing
Java Academy · Ders

Gelecekleri Birleştirme: allOf ve anyOf

Tüm gelecekleri allOf ile bekleyin ve zaman aşımı ile geri dönüş mantığını uygulamak için anyOf ile yarıştırın.

Gelecekleri Birleştirme: allOf ve anyOf, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Gelecekleri Neden Birleştirmelisiniz?

Bağımsız eşzamansız görevler paralel çalışabildiğinde, devam etmeden önce tümünün (veya ilkinin) tamamlanmasını beklemek istersiniz. allOf ve anyOf her iki durumu da yönetir.

allOf: Tüm Gelecekleri Bekleme

CompletableFuture.allOf(futures...), tüm girdi gelecekleri tamamlandığında tamamlanan bir CompletableFuture<Void> döndürür. Herhangi biri başarısız olursa allOf da başarısız olur.

CompletableFuture<String> f1 = fetchUserAsync();
CompletableFuture<List<Order>> f2 = fetchOrdersAsync();
CompletableFuture<Double> f3 = fetchBalanceAsync();
CompletableFuture<Void> all = CompletableFuture.allOf(f1, f2, f3);
all.join(); // wait for all three
String user   = f1.join();
List<Order> orders = f2.join();
Double balance = f3.join();

allOf Sonuçlarını Toplama

allOf Void döndürdüğü için, allOf.join() sonrasında her bir gelecekte join() çağrısı yaparak sonuçları toplayın.

List<CompletableFuture<String>> futures = List.of(
    fetchAsync("url1"), fetchAsync("url2"), fetchAsync("url3"));
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
    .thenApply(v -> futures.stream()
        .map(CompletableFuture::join)
        .collect(Collectors.toList()))
    .thenAccept(results -> results.forEach(System.out::println))
    .join();

anyOf: İlk Tamamlanan Kazanır

CompletableFuture.anyOf(futures...), türü ne olursa olsun ilk tamamlanan geleceğin sonucuyla tamamlanan bir CompletableFuture<Object> döndürür.

CompletableFuture<Object> first = CompletableFuture.anyOf(
    fetchFromCacheAsync(),
    fetchFromDbAsync(),
    fetchFromApiAsync()
);
System.out.println("Fastest result: " + first.join());

Zaman Aşımı Geri Dönüşü için anyOf

Gerçek bir hesaplamayı bir zaman aşımı geleceğiyle yarıştırın. Hangisi önce tamamlanırsa o kazanır; böylece engellemesiz bir zaman aşımı deseni uygulanır.

CompletableFuture<String> real    = fetchDataAsync();
CompletableFuture<String> timeout = CompletableFuture
    .supplyAsync(() -> {
        try { Thread.sleep(2000); } catch (InterruptedException e) {}
        return "timeout-default";
    });
String result = (String) CompletableFuture.anyOf(real, timeout).join();

orTimeout (Java 9+)

orTimeout(time, unit), zamanında tamamlanmazsa geleceği TimeoutException ile tamamlar. Elle uygulanan anyOf-zaman aşımı desenine göre daha temizdir.

CompletableFuture<String> result = fetchDataAsync()
    .orTimeout(3, TimeUnit.SECONDS)
    .exceptionally(ex -> "timeout-default");
System.out.println(result.join());

allOf ile Paralel HTTP Çağrıları

Birden çok hizmete paralel olarak istek gönderin, ardından sonuçları birleştirin. Hizmetler bağımsız olduğunda bu yaklaşım, sıralı çağrılardan çok daha hızlıdır.

List<String> urls = List.of(url1, url2, url3);
List<CompletableFuture<String>> futures = urls.stream()
    .map(url -> CompletableFuture.supplyAsync(() -> httpGet(url)))
    .collect(Collectors.toList());
List<String> responses = CompletableFuture
    .allOf(futures.toArray(new CompletableFuture[0]))
    .thenApply(v -> futures.stream().map(CompletableFuture::join).collect(Collectors.toList()))
    .join();

allOf'da Hata Yönetimi

allOf içindeki bir gelecek başarısız olursa döndürülen gelecek hemen başarısız olur. Bir başarısızlığın tüm toplu işlemi başarısız kılmasını önlemek için tek tek gelecekleri exceptionally ile sarın.

List<CompletableFuture<String>> safe = futures.stream()
    .map(f -> f.exceptionally(ex -> "ERROR: " + ex.getMessage()))
    .collect(Collectors.toList());
CompletableFuture.allOf(safe.toArray(new CompletableFuture[0])).join();

Farklı Türlerle allOf

allOf, farklı türlerdeki gelecekleri kabul eder. Birleştirme işleminden sonra her geleceğin sonucunu beklenen türe dönüştürün.

CompletableFuture<User> userFuture   = fetchUser(id);
CompletableFuture<Config> configFuture = fetchConfig();
CompletableFuture.allOf(userFuture, configFuture).join();
User   user   = userFuture.join();
Config config = configFuture.join();

allOf ve thenApply'ı Birleştirme

Tüm gelecekler tamamlanır tamamlanmaz sonuçları toplamak için allOf üzerine thenApply zincirleyin.

CompletableFuture<String> summary =
    CompletableFuture.allOf(f1, f2, f3)
        .thenApply(v -> "User: " + f1.join() +
                       ", Orders: " + f2.join().size() +
                       ", Balance: " + f3.join());
System.out.println(summary.join());

İş Parçacığı Havuzu Konuları

Bir allOf / anyOf çağrısındaki tüm gelecekler eşzamanlı çalışabilir. Açlık durumunu önlemek için iş parçacığı havuzunda yeterli sayıda iş parçacığı olduğundan emin olun veya sanal iş parçacıkları (Java 21+) kullanın.

// With virtual threads (Java 21+):
ExecutorService vt = Executors.newVirtualThreadPerTaskExecutor();
CompletableFuture<String> f = CompletableFuture.supplyAsync(() -> httpGet(url), vt);

İptal Yayılımı

allOf / anyOf, biri tamamlandığında veya iptal edildiğinde kalan gelecekleri otomatik olarak iptal etmez. Gerekirse her birini ayrı ayrı iptal edin.

CompletableFuture<Object> first = CompletableFuture.anyOf(f1, f2, f3);
first.thenRun(() -> Stream.of(f1, f2, f3).forEach(f -> f.cancel(true)));

Kısa Sınama

CompletableFuture.anyOf ne döndürür?

Özet

allOf tüm gelecekleri bekler (toplama). anyOf ilk sonucu alır (yarıştırma). Zaman aşımları için orTimeout kullanın. Bir başarısızlığın toplu işlemi başarısız kılmasını önlemek için tek tek gelecekleri exceptionally ile sarın.

Sıkça Sorulan Sorular

“Gelecekleri Birleştirme: allOf ve anyOf” dersi ücretsiz mi?

Evet — “Gelecekleri Birleştirme: allOf ve anyOf” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Gelecekleri Birleştirme: allOf ve anyOf” dersinde ne öğreneceğim?

Tüm gelecekleri allOf ile bekleyin ve zaman aşımı ile geri dönüş mantığını uygulamak için anyOf ile yarıştırın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Gelecekleri Birleştirme: allOf ve anyOf” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. CompletableFutures Oluşturma ve Tamamlama
  2. thenApply ve thenCompose ile Zincirleme
  3. Gelecekleri Birleştirme: allOf ve anyOf
  4. Hata İşleme ve Eşzamansız HTTP İş Akışı
← Java Academy Sayfasına Dön