มีประโยชน์จากการใช้
java.util.concurrent.CountdownLatch
แทน
java.util.concurrent.Semaphore ?
เท่าที่ฉันสามารถบอกได้ว่าชิ้นส่วนต่อไปนี้เกือบจะเทียบเท่า:
1. สัญญาณ
final Semaphore sem = new Semaphore(0);
for (int i = 0; i < num_threads; ++ i)
{
Thread t = new Thread() {
public void run()
{
try
{
doStuff();
}
finally
{
sem.release();
}
}
};
t.start();
}
sem.acquire(num_threads);
2: CountDownLatch
final CountDownLatch latch = new CountDownLatch(num_threads);
for (int i = 0; i < num_threads; ++ i)
{
Thread t = new Thread() {
public void run()
{
try
{
doStuff();
}
finally
{
latch.countDown();
}
}
};
t.start();
}
latch.await();
ยกเว้นว่าในกรณี # 2 สลักจะไม่สามารถใช้ซ้ำได้และที่สำคัญคุณต้องรู้ล่วงหน้าว่าจะสร้างเธรดจำนวนเท่าใด (หรือรอจนกว่าจะเริ่มทั้งหมดก่อนที่จะสร้างสลัก)
ดังนั้นในสถานการณ์ใดที่ควรใช้สลัก?