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 denganget()miliknya sendiriShutdownOnSuccess: baca satu pemenang denganresult()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+getper subtugas untuk kondisi semua harus berhasilShutdownOnSuccess+resultuntuk kondisi yang pertama menang- Penghentian menginterupsi subtugas yang tersisa secara kooperatif
joinUntilmenambahkan 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
- Model Konkurensi Terstruktur
- StructuredTaskScope
- Penghentian saat Gagal dan Berhasil
- Penanganan Error dan Pembatalan