Java CountDownLatch: ประตูเปิดครั้งเดียวสำหรับรอ N งานให้เสร็จ
น้องกายEngineering
ต้องการรอให้ worker N ตัวทำจุดตรวจให้ครบแล้วค่อยไปต่อ — ไม่รีเซ็ตเกต — CountDownLatch เหมาะกว่า CyclicBarrier
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;
public class Main {
public static void main(String[] args) throws Exception {
int n = 3;
CountDownLatch done = new CountDownLatch(n);
AtomicInteger hits = new AtomicInteger();
for (int i = 0; i < n; i++) {
Thread t = new Thread(() -> {
hits.incrementAndGet();
done.countDown();
});
t.start();
}
done.await();
assert hits.get() == n : hits.get();
System.out.println("countdownlatch tests passed");
}
}
อย่าลืม countDown() ใน finally ถ้างานอาจโยน exception — ไม่งั้น await() ค้างทั้งโปรเซส
Recap
- ใช้ Latch เมื่อเปิดครั้งเดียว; รีเซ็ตได้ให้ดู Phaser/CyclicBarrier
- จับคู่
awaitกับ timeout ถ้ามี deadline - อ่าน CountDownLatch API