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

การปิดเมื่อเกิดความล้มเหลวและเมื่อสำเร็จ

ประสานผลลัพธ์ของงาน

การปิดเมื่อเกิดความล้มเหลวและเมื่อสำเร็จ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. โมเดลการทำงานพร้อมกันแบบมีโครงสร้าง
  2. StructuredTaskScope
  3. การปิดเมื่อเกิดความล้มเหลวและเมื่อสำเร็จ
  4. การจัดการข้อผิดพลาดและการยกเลิก
← กลับไปที่ Java Academy