Kuncinya setara dengan pintu. Sebelum kunci mencapai keadaan akhir, pintu selalu tertutup dan tidak ada benang yang bisa lewat. Ketika keadaan akhir tercapai, pintu akan terbuka dan membiarkan semua benang lewat. Hal ini dapat membuat satu atau lebih thread menunggu serangkaian peristiwa terjadi. Status latching terdiri dari counter, diinisialisasi ke angka positif formal yang menunjukkan jumlah kejadian yang harus ditunggu. Metode countDown mengurangi penghitung, menunjukkan bahwa suatu peristiwa telah terjadi, sedangkan metode menunggu menunggu penghitung mencapai 0, yang menunjukkan bahwa peristiwa yang ditunggu telah terjadi. CountDownLatch menekankan bahwa satu thread (atau beberapa thread) perlu menunggu n thread lainnya menyelesaikan sesuatu sebelum melanjutkan eksekusi.
Penerapan skenario:
10 atlet bersiap untuk berlari, mereka menunggu perintah wasit dan pada saat yang sama mulai berlari ketika orang terakhir melewati garis finis, permainan berakhir. 10 gerakan setara dengan 10 thread. Kuncinya di sini adalah mengontrol 10 thread agar berjalan secara bersamaan, dan bagaimana menentukan kapan thread terakhir telah mencapai titik akhir. Dua kunci dapat digunakan. Kunci pertama digunakan untuk mengontrol 10 thread menunggu perintah wasit, dan kunci kedua mengontrol akhir permainan.
import java.util.concurrent.CountDownLatch; kelas Aworker mengimplementasikan Runnable { private int num; private CountDownLatch dimulai; private CountDownLatch end; public Aworker(int num, final CountDownLatch dimulai, final CountDownLatch end) { this.num = num ini = mulai; this.end = end; } @Override public void run() { // TODO Metode yang dibuat secara otomatis stub try { System.out.println(num + "orang sudah siap"); mulai.await(); //Siap} catch (InterruptedException e) { e.printStackTrace(); akhirnya { end.countDown(); penghitung berkurang satu dan mencapai titik akhir System.out.println(num + "orang ke-tiba"); public class Race { public static void main(String[] args) { int num = 10; CountDownLatch mulai = new CountDownLatch(1); CountDownLatch end = new CountDownLatch(num); for (int i = 1; i <= num; i++) { Thread baru(new Aworker(i, mulai, akhir)).start() ; } coba { Thread.sleep((long) (Math.random() * 5000)); catch (InterruptedException e1) { // TODO Blok tangkapan yang dibuat secara otomatis e1.printStackTrace(); } System.out.println("hakim berkata: lari!"); //Mulai berlari setelah wasit memberi perintah long startTime = System.nanoTime( ); coba { end.await(); //Tunggu sampai akhir} catch (InterruptedException e) { // TODO Blok tangkapan yang dibuat secara otomatis e.printStackTrace(); System.nanoTime(); System.out.println("hakim mengatakan : semua sudah tiba !"); System.out.println("menghabiskan waktu: " + (endTime - startTime));
keluaran
Orang ke 1 siap Orang ke 2 siap Orang ke 4 siap Orang ke 6 siap Orang ke 3 siap Orang ke 10 siap Orang ke 8 siap Orang ke 5 siap Orang ke 7 siap Orang ke 9 siap Hakim bilang : lari! !9 orang tiba7 orang tiba8 orang tiba3 orang tiba6 orang tibamenunggu waktu: 970933