คำขอแบบอะซิงโครนัส
sendAsync และ CompletableFuture
คำขอแบบอะซิงโครนัส เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คำขอแบบอะซิงโครนัส
การรอทุกการเรียก HTTP ทำให้สิ้นเปลืองเธรด ไคลเอนต์ HTTP ใน JDK มี sendAsync ซึ่งส่งคืน CompletableFuture ทันทีและดำเนินงานผ่านตัวจัดการงานเบื้องหลัง
วิธีนี้ช่วยให้คุณเริ่มคำขอจำนวนมากพร้อมกันและประกอบผลลัพธ์ได้โดยไม่ต้องจัดการเธรดด้วยตนเอง
send เทียบกับ sendAsync
ลายเซ็นแตกต่างกันที่ค่าที่ส่งคืน:
- send ส่งคืน
HttpResponse<T>และระงับการทำงาน พร้อมประกาศIOExceptionและInterruptedException - sendAsync ส่งคืน
CompletableFuture<HttpResponse<T>>และไม่ระงับการทำงาน ข้อผิดพลาดจะแสดงผ่านผลลัพธ์ในอนาคต
การเรียกใช้ sendAsync พื้นฐาน
sendAsync รับคำขอและ BodyHandler เดียวกันกับ send ผลลัพธ์ในอนาคตที่ส่งคืนมาจะเสร็จสมบูรณ์เมื่อการตอบกลับพร้อมใช้งาน
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");
}
}การแปลงด้วย thenApply
ใช้ thenApply เพื่อแปลงผลลัพธ์เมื่อผลลัพธ์มาถึงแล้ว เช่น ดึงเนื้อหาออกจากการตอบกลับ
การทำงานนี้จะเกิดขึ้นแบบซิงโครนัสบนเธรดใดก็ตามที่ทำขั้นก่อนหน้าเสร็จสมบูรณ์
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());
}
}การใช้ผลลัพธ์ด้วย thenAccept
เมื่อคุณต้องการเพียงการทำงานข้างเคียงและไม่ต้องการค่าที่ส่งคืน ให้ใช้ thenAccept เมธอดนี้รับ Consumer และส่งคืน 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();
}
}การรอด้วย join
หากต้องการรอผลลัพธ์แบบอะซิงโครนัสจาก main ให้เรียก join() ซึ่งไม่บังคับให้ตรวจสอบข้อยกเว้น หรือ get() ซึ่งต้องตรวจสอบข้อยกเว้น ในเซิร์ฟเวอร์จริง คุณควรเชื่อมขั้นตอนต่าง ๆ แทนการระงับการทำงาน
join() จะห่อหุ้มความล้มเหลวไว้ใน CompletionException ที่ไม่ต้องตรวจสอบ
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);
}
}การจัดการข้อผิดพลาดด้วย exceptionally
exceptionally จะจัดเตรียมค่าสำรองเมื่อขั้นตอนหนึ่งล้มเหลว เพื่อกู้คืนกระบวนงาน
วิธีนี้ช่วยให้กระบวนการ HTTP แบบอะซิงโครนัสทำงานต่อได้แม้เกิดข้อผิดพลาดของเครือข่าย
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());
}
}การรวมคำขอสองรายการ
thenCombine จะรอผลลัพธ์ในอนาคตที่เป็นอิสระสองรายการ แล้วรวมผลลัพธ์เข้าด้วยกัน เมื่อใช้กับ HTTP แบบอะซิงโครนัส วิธีนี้จะดึงข้อมูลจากจุดปลายทางสองแห่งพร้อมกันและรวมเนื้อหาเข้าด้วยกัน
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);
}
}การเริ่มหลายรายการพร้อมกัน
หากต้องการเรียกใช้คำขอเป็นชุด ให้รวบรวมผลลัพธ์ในอนาคตแต่ละรายการไว้ในรายการ แล้วใช้ CompletableFuture.allOf(...) เพื่อรอให้ทั้งหมดเสร็จสมบูรณ์
allOf ส่งคืน CompletableFuture<Void> คุณจะอ่านผลลัพธ์แต่ละรายการได้ภายหลัง
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());
}
}สรุปรูปแบบอะซิงโครนัส
กระบวนงาน HTTP แบบอะซิงโครนัสทั่วไปมีลักษณะดังนี้:
client.sendAsync(req, BodyHandlers.ofString()).thenApply(HttpResponse::body)เพื่อรับเนื้อหา.thenAccept(System.out::println)เพื่อใช้เนื้อหา.exceptionally(ex -> ...)เพื่อกู้คืนการทำงาน
ไม่มีเธรดใดถูกระงับเพื่อรอเครือข่าย
เมื่อใดควรใช้แบบอะซิงโครนัส
เลือกใช้ sendAsync เมื่อคุณเรียกใช้หลายรายการพร้อมกัน เรียกใช้บริการหลายแห่ง หรือทำงานภายในเซิร์ฟเวอร์แบบรีแอกทีฟที่ไม่ระงับเธรด เลือกใช้ send สำหรับสคริปต์ง่าย ๆ และการเรียกใช้เป็นครั้งคราวที่การระงับการทำงานไม่เป็นปัญหา
ตรวจสอบความเข้าใจ
ตรวจสอบความเข้าใจเกี่ยวกับคำขอแบบอะซิงโครนัส
สรุปทบทวน
คุณได้เรียนรู้การเรียก HTTP โดยไม่ระงับการทำงาน:
- sendAsync ส่งคืน
CompletableFutureแทนการระงับการทำงาน - thenApply / thenAccept ใช้แปลงและใช้ผลลัพธ์
- exceptionally จัดเตรียมค่าสำรองเมื่อเกิดความล้มเหลว
- thenCombine รวมการเรียกใช้สองรายการที่ทำงานพร้อมกัน ส่วน allOf ใช้รอทั้งชุด
- แบบอะซิงโครนัสเหมาะกับเซิร์ฟเวอร์ที่รองรับการทำงานพร้อมกันจำนวนมากและเซิร์ฟเวอร์แบบรีแอกทีฟ ส่วนแบบซิงโครนัสเหมาะกับสคริปต์ง่าย ๆ
คำถามที่พบบ่อย
บทเรียน “คำขอแบบอะซิงโครนัส” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “คำขอแบบอะซิงโครนัส” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “คำขอแบบอะซิงโครนัส”
sendAsync และ CompletableFuture คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “คำขอแบบอะซิงโครนัส” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- java.net.http.HttpClient
- คำขอแบบอะซิงโครนัส
- เนื้อหาและส่วนหัวของคำขอ
- การจัดการการตอบกลับ