การสร้างและทำ CompletableFutures ให้เสร็จสมบูรณ์
ใช้ supplyAsync, runAsync, completedFuture และทำ future ให้เสร็จด้วยตนเองด้วย complete และ completeExceptionally
การสร้างและทำ CompletableFutures ให้เสร็จสมบูรณ์ เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
CompletableFuture คืออะไร
CompletableFuture<T> (Java 8 ขึ้นไป) แทนการคำนวณแบบอะซิงก์ที่สามารถทำให้เสร็จสมบูรณ์ เชื่อมต่อเป็นลำดับ และรวมเข้าด้วยกันได้อย่างชัดเจน โดยใช้งานได้ทั้ง Future และ CompletionStage
supplyAsync: เริ่มการคำนวณแบบอะซิงก์
CompletableFuture.supplyAsync() เรียกใช้ Supplier บนพูล ForkJoinPool ส่วนกลาง และส่งคืนฟิวเจอร์ที่มีผลลัพธ์
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// runs on ForkJoinPool.commonPool()
return fetchDataFromNetwork();
});
System.out.println("Non-blocking — this runs immediately");runAsync: สั่งทำงานแล้วไม่ต้องรอผล
runAsync() เรียกใช้ Runnable แบบอะซิงก์และส่งคืน CompletableFuture<Void> ใช้เมื่อต้องการเพียงให้ทำงานโดยไม่ต้องการผลลัพธ์
CompletableFuture<Void> task = CompletableFuture.runAsync(() ->
sendEmail("user@example.com", "Welcome!"));
task.thenRun(() -> System.out.println("Email sent"));ตัวดำเนินการแบบกำหนดเอง
ส่ง Executor แบบกำหนดเองเพื่อควบคุมพูลเธรดที่ใช้คำนวณ ซึ่งจำเป็นอย่างยิ่งในเว็บแอปพลิเคชันที่ต้องการหลีกเลี่ยงการบล็อกพูลส่วนกลาง
ExecutorService pool = Executors.newFixedThreadPool(10);
CompletableFuture<User> future = CompletableFuture.supplyAsync(
() -> userService.findById(42L), pool
);completedFuture: ค่าที่เสร็จสมบูรณ์แล้ว
CompletableFuture.completedFuture(value) ส่งคืนฟิวเจอร์ที่เสร็จสมบูรณ์แล้ว เหมาะสำหรับการทดสอบหรือกรณีที่มีค่าพร้อมส่งคืนทันทีในกระบวนการทำงานแบบอะซิงก์
CompletableFuture<String> cached = CompletableFuture.completedFuture("cached-value");
cached.thenAccept(System.out::println); // runs immediatelyการทำให้ฟิวเจอร์เสร็จสมบูรณ์ด้วยตนเอง
ใช้ complete() เพื่อส่งผลลัพธ์จากภายนอกการคำนวณ ใช้ completeExceptionally() เพื่อแจ้งความล้มเหลว
CompletableFuture<String> promise = new CompletableFuture<>();
// In another thread or callback:
promise.complete("done!"); // signals success
// promise.completeExceptionally(new RuntimeException("fail")); // signals failure
String result = promise.get(); // blocks until completedget() และ join()
ทั้ง get() และ join() จะบล็อกจนกว่าฟิวเจอร์จะเสร็จสมบูรณ์ get() จะโยนข้อยกเว้นที่คอมไพเลอร์ตรวจสอบ ส่วน join() จะห่อข้อยกเว้นเหล่านั้นไว้ใน CompletionException ที่ไม่ต้องตรวจสอบ
try {
String r = future.get(5, TimeUnit.SECONDS); // checked exceptions
} catch (TimeoutException | InterruptedException | ExecutionException e) { ... }
// Or:
String r = future.join(); // throws CompletionException (unchecked)getNow() สำหรับการตรวจสอบแบบไม่บล็อก
getNow(defaultValue) จะส่งคืนผลลัพธ์หากเสร็จสมบูรณ์แล้ว หรือส่งคืนค่าเริ่มต้นที่ระบุหากยังไม่เสร็จ โดยไม่บล็อกและไม่ต้องรอ
String result = future.getNow("loading...");
System.out.println(result); // "loading..." if not yet doneisDone, isCancelled, isCompletedExceptionally
ตรวจสอบสถานะของฟิวเจอร์โดยไม่บล็อก คุณสามารถรวมการตรวจสอบเหล่านี้ไว้ในลูปตรวจสอบสถานะหรือโค้ดตรวจสอบการทำงานได้
if (future.isDone()) System.out.println("Completed");
if (future.isCancelled()) System.out.println("Cancelled");
if (future.isCompletedExceptionally()) System.out.println("Failed");cancel() สำหรับจัดการเวลาหมด
เรียก cancel(true) เพื่อยกเลิกการคำนวณที่กำลังดำเนินอยู่ ฟิวเจอร์จะเปลี่ยนเป็นสถานะถูกยกเลิก และการเรียก get() ที่กำลังบล็อกอยู่จะโยน CancellationException
CompletableFuture<String> future = fetchAsync();
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.schedule(() -> future.cancel(true), 3, TimeUnit.SECONDS);completeOnTimeout (Java 9 ขึ้นไป)
completeOnTimeout(value, timeout, unit) จะทำให้ฟิวเจอร์เสร็จสมบูรณ์ด้วยค่าเริ่มต้นโดยอัตโนมัติ หากฟิวเจอร์ยังไม่เสร็จภายในเวลาที่กำหนด ซึ่งสะอาดกว่าการยกเลิกด้วยตนเอง
CompletableFuture<String> result = fetchAsync()
.completeOnTimeout("default", 3, TimeUnit.SECONDS);
System.out.println(result.join()); // "default" if fetch took > 3sตรวจสอบความเข้าใจ
เมธอดใดเริ่มการคำนวณแบบอะซิงก์บนพูล ForkJoinPool ส่วนกลางและส่งคืนค่า
สรุปทบทวน
supplyAsync / runAsync เริ่มงานแบบอะซิงก์ ส่วน complete / completeExceptionally ใช้ทำให้เสร็จสมบูรณ์ด้วยตนเอง ใช้ join() สำหรับการบล็อกที่ไม่ต้องตรวจสอบข้อยกเว้น และใช้ completeOnTimeout เพื่อจัดการเวลาหมดอย่างเหมาะสม
คำถามที่พบบ่อย
บทเรียน “การสร้างและทำ CompletableFutures ให้เสร็จสมบูรณ์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสร้างและทำ CompletableFutures ให้เสร็จสมบูรณ์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสร้างและทำ CompletableFutures ให้เสร็จสมบูรณ์”
ใช้ supplyAsync, runAsync, completedFuture และทำ future ให้เสร็จด้วยตนเองด้วย complete และ completeExceptionally คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การสร้างและทำ CompletableFutures ให้เสร็จสมบูรณ์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสร้างและทำ CompletableFutures ให้เสร็จสมบูรณ์
- การเชื่อมต่อด้วย thenApply และ thenCompose
- การรวม Futures: allOf และ anyOf
- การจัดการข้อผิดพลาดและไปป์ไลน์ HTTP แบบอะซิงโครนัส