0Pricing
Java Academy · บทเรียน

คำขอแบบอะซิงโครนัส

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. java.net.http.HttpClient
  2. คำขอแบบอะซิงโครนัส
  3. เนื้อหาและส่วนหัวของคำขอ
  4. การจัดการการตอบกลับ
← กลับไปที่ Java Academy