Permintaan Asinkron
sendAsync dan CompletableFuture.
Permintaan Asinkron adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 2 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.
Permintaan Asinkron
Memblokir pada setiap panggilan HTTP memboroskan utas. Klien HTTP JDK menyediakan sendAsync, yang segera mengembalikan CompletableFuture dan menjalankan pekerjaan pada eksekutor latar belakang.
Dengan demikian, Anda dapat menjalankan banyak permintaan secara bersamaan dan menggabungkan hasilnya tanpa mengelola utas secara manual.
send dibandingkan dengan sendAsync
Tanda tangan metodenya berbeda dalam hal nilai yang dikembalikan:
- send mengembalikan
HttpResponse<T>dan memblokir, serta mendeklarasikanIOExceptiondanInterruptedException. - sendAsync mengembalikan
CompletableFuture<HttpResponse<T>>dan tidak pernah memblokir; kesalahan muncul melalui future tersebut.
Panggilan sendAsync Dasar
sendAsync menerima permintaan dan BodyHandler yang sama seperti send. Future yang dikembalikan selesai ketika respons sudah siap.
import java.net.URI;
import java.net.http.*;
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.build();
CompletableFuture<HttpResponse<String>> future =
client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Request sent, future created");
}
}Mengubah dengan thenApply
Gunakan thenApply untuk mengubah hasil setelah hasil tersebut tiba — misalnya, mengambil isi dari respons.
Operasi ini berjalan secara sinkron pada utas mana pun yang menyelesaikan tahap sebelumnya.
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) throws Exception {
CompletableFuture<String> future =
CompletableFuture.completedFuture("OK 200")
.thenApply(body -> "Length=" + body.length());
System.out.println(future.get());
}
}Mengonsumsi dengan thenAccept
Jika Anda hanya menginginkan efek samping tanpa nilai yang dikembalikan, gunakan thenAccept. Metode ini menerima Consumer dan menghasilkan CompletableFuture<Void>.
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) throws Exception {
CompletableFuture<Void> done =
CompletableFuture.completedFuture("payload")
.thenAccept(b -> System.out.println("Received: " + b));
done.get();
}
}Memblokir dengan join
Untuk menunggu hasil asinkron dari main, panggil join() (tidak terperiksa) atau get() (terperiksa). Pada server nyata, Anda akan merangkai berbagai tahap, bukan memblokir.
join() membungkus kegagalan dalam CompletionException yang tidak terperiksa.
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
CompletableFuture<Integer> f =
CompletableFuture.supplyAsync(() -> 21).thenApply(n -> n * 2);
int result = f.join();
System.out.println("Result: " + result);
}
}Menangani Kesalahan dengan exceptionally
exceptionally menyediakan nilai cadangan ketika sebuah tahap gagal, sehingga memulihkan alur.
Dengan cara inilah Anda mencegah alur HTTP asinkron berhenti akibat kesalahan jaringan.
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
CompletableFuture<String> f = CompletableFuture
.<String>supplyAsync(() -> { throw new RuntimeException("boom"); })
.exceptionally(ex -> "fallback: " + ex.getMessage());
System.out.println(f.join());
}
}Menggabungkan Dua Permintaan
thenCombine menunggu dua future independen lalu menggabungkan hasilnya. Dengan HTTP asinkron, cara ini mengambil data dari dua titik akhir secara paralel dan menggabungkan isinya.
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
CompletableFuture<String> a = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> b = CompletableFuture.supplyAsync(() -> "World");
String combined = a.thenCombine(b, (x, y) -> x + " " + y).join();
System.out.println(combined);
}
}Menjalankan Banyak Permintaan secara Paralel
Untuk menjalankan sekumpulan permintaan, kumpulkan setiap objek future ke dalam sebuah daftar, lalu gunakan CompletableFuture.allOf(...) untuk menunggu semuanya selesai.
allOf mengembalikan CompletableFuture<Void>; Anda membaca hasil setiap permintaan setelahnya.
import java.util.*;
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
List<CompletableFuture<Integer>> futures = new ArrayList<>();
for (int i = 1; i <= 3; i++) {
int n = i;
futures.add(CompletableFuture.supplyAsync(() -> n * n));
}
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
for (var f : futures) System.out.println(f.join());
}
}Rangkuman Pola Asinkron
Alur HTTP asinkron yang umum terlihat seperti ini:
client.sendAsync(req, BodyHandlers.ofString()).thenApply(HttpResponse::body)untuk mendapatkan isi.thenAccept(System.out::println)untuk mengonsumsinya.exceptionally(ex -> ...)untuk memulihkan alur
Tidak ada utas yang pernah diblokir saat menunggu jaringan.
Kapan Memilih Asinkron
Pilih sendAsync ketika Anda membuat banyak panggilan bersamaan, menyebarkan permintaan ke beberapa layanan, atau berjalan di dalam server reaktif/tanpa pemblokiran. Pilih send untuk skrip sederhana dan panggilan sekali pakai yang tidak masalah jika memblokir.
Uji Cepat
Periksa pemahaman Anda tentang permintaan asinkron.
Rangkuman
Anda telah mempelajari cara membuat panggilan HTTP tanpa pemblokiran:
- sendAsync mengembalikan
CompletableFuture, bukan memblokir. - thenApply / thenAccept mengubah dan mengonsumsi hasil.
- exceptionally menyediakan nilai cadangan ketika terjadi kegagalan.
- thenCombine menggabungkan dua panggilan paralel; allOf menunggu sekumpulan panggilan.
- Asinkron sesuai untuk server dengan konkurensi tinggi dan server reaktif; sinkron sesuai untuk skrip sederhana.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Permintaan Asinkron” gratis?
Ya — teks lengkap “Permintaan Asinkron” 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 “Permintaan Asinkron”?
sendAsync dan CompletableFuture. 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 2 dari 4.
Berapa lama pelajaran “Permintaan Asinkron” 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
- java.net.http.HttpClient
- Permintaan Asinkron
- Body dan Header Permintaan
- Menangani Respons