การปิดเมื่อเกิดความล้มเหลวและเมื่อสำเร็จ
ประสานผลลัพธ์ของงาน
การปิดเมื่อเกิดความล้มเหลวและเมื่อสำเร็จ เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
รูปแบบที่ใช้บ่อยสองแบบ
การแยกงานพร้อมกันส่วนใหญ่อยู่ในรูปแบบใดรูปแบบหนึ่งจากสองรูปแบบ:
- ทุกงานต้องสำเร็จ: หากงานใดล้มเหลว ให้ละทิ้งงานที่เหลือ ใช้
ShutdownOnFailure - งานแรกเป็นผู้ชนะ: ทันทีที่งานหนึ่งสำเร็จ ให้ยกเลิกงานที่เหลือ ใช้
ShutdownOnSuccess
JDK มีทั้งสองรูปแบบพร้อมใช้งาน
แนวคิดของ ShutdownOnFailure
ShutdownOnFailure เหมาะกับงานที่ต้องสำเร็จทั้งหมด เช่น การรวบรวมประวัติผู้ใช้และรายการคำสั่งซื้อของผู้ใช้คนนั้นเข้าด้วยกัน
หากงานย่อยงานหนึ่งโยนข้อยกเว้น scope จะยกเลิกงานอื่น ๆ เพื่อไม่ให้คุณเสียเวลาไปกับการทำงานที่ไม่จำเป็น
ตัวอย่าง ShutdownOnFailure
หลังจาก join() คุณเรียก throwIfFailed() ซึ่งจะโยนความล้มเหลวแรกกลับมาอีกครั้ง (หากมี) โดยห่อไว้ใน ExecutionException
import java.util.concurrent.StructuredTaskScope;
public class Main {
public static void main(String[] args) throws Exception {
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
var a = scope.fork(() -> fetch("profile"));
var b = scope.fork(() -> fetch("orders"));
scope.join();
scope.throwIfFailed();
System.out.println(a.get() + " + " + b.get());
}
}
static String fetch(String what) {
return what + "-ok";
}
}สิ่งที่ throwIfFailed ทำ
throwIfFailed() จะตรวจสอบงานย่อย หากงานทั้งหมดสำเร็จ ฟังก์ชันจะไม่ทำอะไร หากมีงานใดล้มเหลว ฟังก์ชันจะโยนข้อยกเว้นโดยห่อข้อยกเว้นเดิมไว้
คุณยังสามารถส่งฟังก์ชันเพื่อแปลงสาเหตุให้เป็นชนิดข้อยกเว้นที่กำหนดเองได้
แนวคิดของ ShutdownOnSuccess
ShutdownOnSuccess เหมาะกับการทำงานสำรองหรือการแข่งกันทำงาน เช่น สอบถามกระจกหลายแห่งแล้วรับคำตอบจากแห่งที่ตอบกลับก่อน
ทันทีที่งานย่อยงานหนึ่งสำเร็จ scope จะยกเลิกงานที่เหลือและเก็บผลลัพธ์ของงานที่ชนะไว้
ตัวอย่าง ShutdownOnSuccess
คุณดึงค่าที่ชนะได้ด้วย result() ฟังก์ชันนี้จะโยนข้อยกเว้นหากไม่มีงานย่อยใดสำเร็จเลย
import java.util.concurrent.StructuredTaskScope;
public class Main {
public static void main(String[] args) throws Exception {
try (var scope = new StructuredTaskScope.ShutdownOnSuccess<String>()) {
scope.fork(() -> queryMirror("eu"));
scope.fork(() -> queryMirror("us"));
scope.join();
System.out.println("Fastest answer: " + scope.result());
}
}
static String queryMirror(String region) {
return region + "-data";
}
}ผลลัพธ์เทียบกับ get
สังเกตความแตกต่าง:
ShutdownOnFailure: อ่านงานย่อยแต่ละงานด้วยget()ของงานนั้นเองShutdownOnSuccess: อ่านผู้ชนะเพียงรายเดียวด้วยresult()ของ scope
การยกเลิกเป็นกระบวนการร่วมมือ
เมื่อ scope หยุดทำงาน scope จะ ขัดจังหวะเธรดของงานย่อยที่เหลือ งานที่เขียนไว้อย่างเหมาะสมจะตรวจสอบการขัดจังหวะและหยุดโดยเร็ว
การเรียกที่ขัดขวางการทำงานในไลบรารีมาตรฐานโดยทั่วไปจะตอบสนองต่อการขัดจังหวะโดยอัตโนมัติ
ใช้ join พร้อมกำหนดเวลาหมด
นโยบายทั้งสองแบบรองรับกำหนดเวลา การเรียก joinUntil(Instant) จะรอจนถึงจุดเวลาที่กำหนดเท่านั้น จากนั้นจะโยน TimeoutException และสั่งให้ scope หยุดทำงาน
การเลือกนโยบาย
ถามตัวเองด้วยคำถามเดียว: ฉันต้องการผลลัพธ์ทั้งหมด หรือแค่ผลลัพธ์แรก
- ต้องการผลลัพธ์ทั้งหมดและล้มเหลวทันทีเมื่อเกิดข้อผิดพลาด:
ShutdownOnFailure - ต้องการผลลัพธ์ใดผลลัพธ์หนึ่ง โดยให้ผลลัพธ์ที่เร็วที่สุดเป็นผู้ชนะ:
ShutdownOnSuccess
สำหรับกรณีอื่น ให้สร้างคลาสย่อยของ StructuredTaskScope
นโยบายที่กำหนดเอง
คุณสามารถขยาย StructuredTaskScope และเขียนทับ handleComplete(Subtask) เพื่อสร้างกฎเฉพาะ เช่น รวบรวมความสำเร็จ N รายการแรก หรือหยุดทำงานหลังจากมีความล้มเหลวครบตามโควตา
ตรวจสอบความเข้าใจอย่างรวดเร็ว
จับคู่สถานการณ์กับนโยบายที่เหมาะสม
สรุปทบทวน
คุณได้เรียนรู้นโยบายหยุดทำงานที่มีมาให้สองแบบ:
ShutdownOnFailure+throwIfFailed+getแยกตามงานย่อย สำหรับกรณีที่ทุกงานต้องสำเร็จShutdownOnSuccess+resultสำหรับกรณีที่งานแรกเป็นผู้ชนะ- การหยุดทำงานจะขัดจังหวะงานย่อยที่เหลือผ่านความร่วมมือของงานเหล่านั้น
joinUntilเพิ่มกำหนดเวลา ส่วนการสร้างคลาสย่อยช่วยเพิ่มกฎที่กำหนดเอง
ถัดไป: การจัดการข้อผิดพลาดและการยกเลิกโดยละเอียด
คำถามที่พบบ่อย
บทเรียน “การปิดเมื่อเกิดความล้มเหลวและเมื่อสำเร็จ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การปิดเมื่อเกิดความล้มเหลวและเมื่อสำเร็จ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การปิดเมื่อเกิดความล้มเหลวและเมื่อสำเร็จ”
ประสานผลลัพธ์ของงาน คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การปิดเมื่อเกิดความล้มเหลวและเมื่อสำเร็จ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- โมเดลการทำงานพร้อมกันแบบมีโครงสร้าง
- StructuredTaskScope
- การปิดเมื่อเกิดความล้มเหลวและเมื่อสำเร็จ
- การจัดการข้อผิดพลาดและการยกเลิก