Tampaknya penghitung mundur, memanggil metode hitung mundur dari objek Countdownlatch, dikurangi penghitung dengan 1. Ketika mencapai 0, semua pelayan mulai mengeksekusi.
java.util.concurrent.countdownlaatch
Kelas tambahan yang sinkron, sebelum menyelesaikan satu set operasi di utas lain, memungkinkan satu atau lebih utas untuk menunggu. Gunakan hitungan yang diberikan untuk menginisialisasi hitungan mundur. Karena metode Countdown () dipanggil, metode menunggu telah diblokir sebelum penghitungan saat ini mencapai nol. Setelah itu, semua utas menunggu akan dirilis, dan semua panggilan AWAIT berikutnya akan segera kembali. Fenomena ini hanya muncul sekali -penghitungan tidak dapat diatur ulang. Jika Anda perlu mengatur ulang penghitungan, pertimbangkan untuk menggunakan cyclicbarrier.
Countdownlatch adalah alat sinkronisasi umum, yang memiliki banyak kegunaan. Gunakan penghitungan 1 inisialisasi countOwnClatch sebagai depositor pembukaan/kunci sederhana, atau pintu masuk: Sebelum membuka pintu masuk dengan memanggil panggilan utas hitung mundur (), semua panggilan utas menunggu telah menunggu di pintu masuk. Gunakan N Inisial dari Countdownlatch dapat menunggu utas untuk menunggu sebelum utas N selesai, atau tetap menunggu sebelum operasi tertentu.
Salah satu fitur berguna dari Countdownlatch adalah tidak memerlukan utas yang memanggil metode hitung mundur untuk melanjutkan sampai dihitung pada nol, dan sebelum semua utas dapat melewati, itu hanya mencegah utas apa pun dari melanjutkan melalui menunggu.
Contoh: Banyak atlet sedang menunggu pesanan wasit: semua atlet seperti wasit dan atlet lainnya melepaskan hasilnya setelah qi qi
Paket com.ljq.test.thread; .Newcachedthreadpool (); Wasit mengumumkan hasil hasilnya. raun () {coba {System.out.println ("Thread" + Thread.CurrentThread (). GetName () + "sedang mempersiapkan untuk menerima perintah"); + thread.currentThread (). +"Hasil Pemrosesan Perintah") ;;} Catch (Exception e) {E.PrintStackTrace ();}}; .random ()*10000)); System.out.println ("Thread" + Thread.CurrentThread (). GetName () + "telah mengirim perintah, menunggu hasilnya"); 0 Semua atlet di Place System.out.println ("Thread" + Thread.CurrentThread (). GetName () + "telah menerima semua hasil respons"););} service.shutdown ();}}Hasil punggung:
Thread Pool-Thread-3 sedang bersiap untuk menerima command thread pool-1-thread-is IS bersiap untuk menerima command thread pool-thread-2 sedang bersiap untuk menerima utas perintah utama akan segera mengirim utas perintah utama telah mengirim Perintah, menunggu hasil hasilnya, sedang menunggu hasil hasil utas kumpulan-thread-2 telah menerima command thread pool-1-thread-1 pool-1-thread-3 telah menerima command thread pool-thread-3 Tanggapi Hasil Pemrosesan Hasil Perintah Utas Pool-1- Thread-2 Respons terhadap Hasil Pemrosesan Utas Hasil Perintah Benang Pool-1-Thread-1 Hasil Pemrosesan Perintah Hasil Hasil Utama telah menerima semua hasil respons