0Pricing
Java Academy · Pelajaran

Penghentian saat Gagal dan Berhasil

Koordinasikan hasil tugas.

Penghentian saat Gagal dan Berhasil adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

Dua Pola Umum

Sebagian besar pencabangan konkuren mengikuti dua pola:

  • Semua harus berhasil: jika salah satu gagal, hentikan yang lain. Gunakan ShutdownOnFailure.
  • Yang pertama menang: segera setelah salah satu berhasil, batalkan yang lain. Gunakan ShutdownOnSuccess.

JDK menyediakan keduanya secara langsung.

Gagasan ShutdownOnFailure

ShutdownOnFailure ditujukan untuk tugas-tugas yang semuanya harus berhasil, seperti mengumpulkan profil pengguna dan pesanannya secara bersamaan.

Jika salah satu subtugas melemparkan pengecualian, scope membatalkan subtugas lainnya agar Anda tidak membuang-buang usaha.

Contoh ShutdownOnFailure

Setelah join(), Anda memanggil throwIfFailed(), yang melemparkan kembali kegagalan pertama (jika ada) dalam bentuk yang dibungkus oleh 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";
    }
}

Yang Dilakukan throwIfFailed

throwIfFailed() memeriksa subtugas. Jika semuanya berhasil, metode ini tidak melakukan apa pun. Jika ada yang gagal, metode ini melemparkan pengecualian dan membungkus pengecualian aslinya.

Anda juga dapat memberikan fungsi untuk memetakan penyebabnya ke tipe pengecualian khusus.

Gagasan ShutdownOnSuccess

ShutdownOnSuccess ditujukan untuk redundansi atau perlombaan: kueri beberapa server cermin dan ambil yang menjawab lebih dahulu.

Saat salah satu subtugas berhasil, scope segera membatalkan sisanya dan menyimpan hasil yang menang.

Contoh ShutdownOnSuccess

Anda mengambil nilai pemenang dengan result(). Metode ini melemparkan pengecualian jika tidak ada subtugas yang pernah berhasil.

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";
    }
}

result vs get

Perhatikan perbedaannya:

  • ShutdownOnFailure: baca setiap subtugas dengan get() miliknya sendiri
  • ShutdownOnSuccess: baca satu pemenang dengan result() milik scope

Pembatalan Bersifat Kooperatif

Saat scope dihentikan, scope menginterupsi utas subtugas yang tersisa. Tugas yang ditulis dengan baik akan memeriksa interupsi dan segera berhenti.

Panggilan pemblokiran di pustaka standar umumnya merespons interupsi secara otomatis.

join dengan Batas Waktu

Kedua kebijakan mendukung tenggat waktu. Pemanggilan joinUntil(Instant) hanya menunggu hingga suatu titik waktu, kemudian melemparkan TimeoutException dan menghentikan scope.

Memilih Kebijakan

Ajukan satu pertanyaan kepada diri sendiri: apakah saya memerlukan semua hasil, atau hanya hasil pertama?

  • Semua hasil, gagal secepat mungkin saat terjadi kesalahan: ShutdownOnFailure
  • Satu hasil apa pun, yang tercepat menang: ShutdownOnSuccess

Untuk kebutuhan lainnya, buat subkelas StructuredTaskScope.

Kebijakan Khusus

Anda dapat memperluas StructuredTaskScope dan mengganti handleComplete(Subtask) untuk menerapkan aturan khusus, seperti mengumpulkan N keberhasilan pertama atau menghentikan scope setelah mencapai kuota kegagalan.

Pemeriksaan Cepat

Pasangkan skenario dengan kebijakannya.

Ringkasan

Anda telah mempelajari dua kebijakan penghentian bawaan:

  • ShutdownOnFailure + throwIfFailed + get per subtugas untuk kondisi semua harus berhasil
  • ShutdownOnSuccess + result untuk kondisi yang pertama menang
  • Penghentian menginterupsi subtugas yang tersisa secara kooperatif
  • joinUntil menambahkan tenggat waktu; pembuatan subkelas menambahkan aturan khusus

Berikutnya: penanganan kesalahan dan pembatalan secara mendetail.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Penghentian saat Gagal dan Berhasil” gratis?

Ya — teks lengkap “Penghentian saat Gagal dan Berhasil” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Penghentian saat Gagal dan Berhasil”?

Koordinasikan hasil tugas. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Penghentian saat Gagal dan Berhasil” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Model Konkurensi Terstruktur
  2. StructuredTaskScope
  3. Penghentian saat Gagal dan Berhasil
  4. Penanganan Error dan Pembatalan
← Kembali ke Java Academy