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
- Membuat dan Menyelesaikan CompletableFutures
- Merangkai dengan thenApply dan thenCompose
- Menggabungkan Future: allOf dan anyOf
- Penanganan Error dan Alur HTTP Async