2011-07-06 54 views
5

Quiero implementar una barrera de java personalizada. No quiero usar el CyclicBarrier class.Implementar la barrera de java personalizada

De modo que todos los hilos se encuentran en un punto común. Los hilos solo se procesaron si todos los hilos llegaban a la barrera.

Quiero usar los métodos wait/notify/notifyAll para implementar la barrera.

Así que esto es lo que me ocurrió con

public class Barrier{ 

    private final int threadNumber; 

    public Barrier(int pThreadNumber){ 
     this.threadNumber = pThreadNumber; 
    } 

    public synchronized void barrier(){ 
     wait(); 
    } 

    public synchronized void releaseBarrier(){ 
     notifyAll(); 
    } 

    public synchronized void releaseThread(){ 
     notify(); 
    } 
} 

Pero no entiendo muy bien cómo lograr que un cierto número de hilos se detuvo hasta que llegaron todas las discusiones. ¿Es posible implementar una barrera usando solo esperar/notificar/notificar a todos?

+2

¿Es esta tarea? ¿O por qué no quieres usar un CyclicBarrier? – meriton

+0

Solo trato de entrar en los subprocesos Java y la concurrencia, y esto parece ser un ejercicio interesante para aprender de –

Respuesta

3

Una especie de tarea, por lo que sólo le pongo una pista:

Quiere todas las discusiones de proceder cuando threadNumber hilos están esperando. Eso es equivalente a los primeros hilos threadNumber - 1 que esperan el threadNumber -th thread para llegar. Una forma es contar el número de subprocesos y hacer algo especial una vez que llega el threadNumber -th thread.

0

Una sugerencia adicional que está relacionada con un detalle de Java: un hilo que está bloqueado en un wait() se puede activar de manera espuria; ver el Object.wait() javadocs.

Para tolerar los despertares espurios, necesita tener un lazo while donde la lógica simple solo requiere una verificación if o una wait() ciega.

Cuestiones relacionadas