0Pricing
Java Academy · Pelajaran

Menggabungkan Future: allOf dan anyOf

Tunggu semua future dengan allOf dan adukan eksekusinya dengan anyOf untuk menerapkan logika batas waktu dan cadangan.

Menggabungkan Future: allOf dan anyOf adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

Mengapa Menggabungkan Future?

Ketika tugas asinkron yang tidak saling bergantung dapat berjalan secara paralel, Anda perlu menunggu hingga semuanya (atau yang pertama) selesai sebelum melanjutkan. allOf dan anyOf menangani kedua kasus tersebut.

allOf: Menunggu Semua Future

CompletableFuture.allOf(futures...) mengembalikan CompletableFuture<Void> yang selesai ketika ALL future input selesai. Jika salah satunya gagal, allOf juga gagal.

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();

Mengumpulkan Hasil allOf

Karena allOf mengembalikan Void, kumpulkan hasil dengan memanggil join() pada setiap future secara individual setelah allOf.join().

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: Yang Pertama Selesai Menang

CompletableFuture.anyOf(futures...) mengembalikan CompletableFuture<Object> yang selesai dengan hasil dari future pertama yang selesai, apa pun tipenya.

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

anyOf untuk Batas Waktu Cadangan

Jalankan komputasi nyata secara bersaing dengan future batas waktu. Apa pun yang selesai terlebih dahulu akan menang — sehingga terbentuk pola batas waktu tanpa pemblokiran.

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) menyelesaikan future dengan TimeoutException jika future tidak selesai tepat waktu. Ini lebih rapi daripada pola anyOf dengan batas waktu manual.

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

Pemanggilan HTTP Paralel dengan allOf

Kirim permintaan ke beberapa layanan secara paralel, lalu gabungkan hasilnya. Cara ini jauh lebih cepat daripada pemanggilan berurutan ketika layanan-layanan tersebut tidak saling bergantung.

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();

Penanganan Kesalahan dalam allOf

Jika salah satu future dalam allOf gagal, future yang dikembalikan langsung gagal. Bungkus setiap future dengan exceptionally agar satu kegagalan tidak menggagalkan seluruh kelompok.

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();

allOf dengan Tipe Berbeda

allOf menerima future dengan tipe berbeda. Setelah menggabungkannya, konversikan hasil setiap future ke tipe yang diharapkan.

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

Menggabungkan allOf dan thenApply

Rangkai thenApply pada allOf untuk menggabungkan hasil segera setelah semua future selesai.

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());

Pertimbangan Kumpulan Utas

Semua future dalam pemanggilan allOf / anyOf dapat berjalan secara bersamaan. Pastikan kumpulan utas memiliki cukup utas, atau gunakan utas virtual (Java 21+) agar tidak terjadi kekurangan sumber daya.

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

Propagasi Pembatalan

allOf / anyOf tidak secara otomatis membatalkan future yang tersisa ketika salah satunya selesai atau dibatalkan. Batalkan setiap future secara individual jika diperlukan.

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

Pemeriksaan Singkat

Apa yang dikembalikan CompletableFuture.anyOf?

Ringkasan

allOf menunggu semua future (penggabungan). anyOf mengambil hasil pertama (persaingan). Gunakan orTimeout untuk batas waktu. Bungkus setiap future dengan exceptionally agar satu kegagalan tidak menggagalkan seluruh kelompok.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Menggabungkan Future: allOf dan anyOf” gratis?

Ya — teks lengkap “Menggabungkan Future: allOf dan anyOf” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Menggabungkan Future: allOf dan anyOf”?

Tunggu semua future dengan allOf dan adukan eksekusinya dengan anyOf untuk menerapkan logika batas waktu dan cadangan. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Menggabungkan Future: allOf dan anyOf” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Membuat dan Menyelesaikan CompletableFutures
  2. Merangkai dengan thenApply dan thenCompose
  3. Menggabungkan Future: allOf dan anyOf
  4. Penanganan Error dan Alur HTTP Async
← Kembali ke Java Academy