¿Hay alguna ventaja de utilizarCountDownLatch vs Semáforo
java.util.concurrent.CountdownLatch
en lugar de
java.util.concurrent.Semaphore?
Por lo que yo puedo decir los siguientes fragmentos son casi equivalentes:
1. Semáforo
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();
Salvo que en el caso # 2 el pestillo no puede reutilizarse y, lo que es más importante, debe saber con antelación h Se crearán muchos subprocesos (o espere hasta que estén todos iniciados antes de crear el pestillo).
Entonces, ¿en qué situación podría ser preferible el pestillo?
Gracias. Por lo tanto, mis dos ejemplos no serían equivalentes si varios subprocesos pudieran esperar en el pestillo ... a menos que sem.acquire (num_threads); es seguido por sem.lanzamiento (num_threads) ;? Creo que eso los haría equivalentes de nuevo. – finnw
En cierto sentido, sí, siempre y cuando cada hilo denominado adquirir seguido de lanzamiento. Estrictamente hablando, no. Con un seguro, todos los hilos son elegibles para comenzar simultáneamente. Con el semáforo, se vuelven elegibles uno tras otro (lo que podría dar lugar a una programación diferente del hilo). –
La documentación de Java parece implicar que un CountdownLatch encaja bien con su ejemplo: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/CountDownLatch.html. Específicamente, "Un CountDownLatch inicializado en N se puede usar para hacer que un hilo espere hasta que N hilos hayan completado alguna acción o alguna acción se haya completado N veces". –