//Implementacion de una cola circular con sincronizacion en sus metodos
public class ColaCircular
{
private Object[] array
; //Arreglo de cualquier tipo en donde se implementara la cola circular private int ptrCola = 0, ptrCabeza = 0; //Enteros que indican el inicio y fin de la cola
private int eltosRellenos = 0; //Cantidad de elementos en la cola
public ColaCircular (int capacidad)
{
array
= new Object [capacidad
]; }
//Permite que solo un hilo a la vez ingrese al metodo
public synchronized void Insertar
(Object o
) { while (eltosRellenos == array.length){
try {
wait (); //Pone el hilo en espera hasta que un hilo notifique y la condicion sea falsa
}
//Se agrega el elemento al final de la cola y se actualiza el indice que indica fin de la cola
array[ptrCola] = o;
ptrCola = (ptrCola + 1) % array.length;
//La cantidad de elementos aumenta y se notifica a los demas hilos que el hilo salió del metodo
eltosRellenos++;
notifyAll();
}
//Permite que solo un hilo a la vez ingrese al metodo
public synchronized Object Extraer
() { while (eltosRellenos == 0){
try {
wait (); //Pone el hilo en espera hasta que un hilo notifique y la condicion sea falsa
}
//Se guarda el elemento que se va a borrar para ser retornado
Object obj
= array
[ptrCabeza
];
//La posicion inicial se establece como nula y se actualiza el inicio de la cola
array[ptrCabeza] = null;
ptrCabeza = (ptrCabeza + 1) % array.length;
//La cantidad de elementos disminuye y se notifica a los demas hilos que el hilo salió del metodo
eltosRellenos--;
notifyAll();
return obj;
}
}