• Source
    1. //Implementacion de una cola circular con sincronizacion en sus metodos
    2. public class ColaCircular
    3. {
    4. private Object[] array; //Arreglo de cualquier tipo en donde se implementara la cola circular
    5. private int ptrCola = 0, ptrCabeza = 0; //Enteros que indican el inicio y fin de la cola
    6. private int eltosRellenos = 0; //Cantidad de elementos en la cola
    7.  
    8. public ColaCircular (int capacidad)
    9. {
    10. array = new Object [capacidad];
    11. }
    12.  
    13. //Permite que solo un hilo a la vez ingrese al metodo
    14. public synchronized void Insertar (Object o) {
    15. while (eltosRellenos == array.length){
    16. try {
    17. wait (); //Pone el hilo en espera hasta que un hilo notifique y la condicion sea falsa
    18. }catch (InterruptedException e) {}
    19. }
    20. //Se agrega el elemento al final de la cola y se actualiza el indice que indica fin de la cola
    21. array[ptrCola] = o;
    22. ptrCola = (ptrCola + 1) % array.length;
    23.  
    24. //La cantidad de elementos aumenta y se notifica a los demas hilos que el hilo salió del metodo
    25. eltosRellenos++;
    26. notifyAll();
    27. }
    28.  
    29. //Permite que solo un hilo a la vez ingrese al metodo
    30. public synchronized Object Extraer () {
    31. while (eltosRellenos == 0){
    32. try {
    33. wait (); //Pone el hilo en espera hasta que un hilo notifique y la condicion sea falsa
    34. }catch (InterruptedException e) {}
    35. }
    36.  
    37. //Se guarda el elemento que se va a borrar para ser retornado
    38. Object obj = array[ptrCabeza];
    39.  
    40. //La posicion inicial se establece como nula y se actualiza el inicio de la cola
    41. array[ptrCabeza] = null;
    42. ptrCabeza = (ptrCabeza + 1) % array.length;
    43.  
    44. //La cantidad de elementos disminuye y se notifica a los demas hilos que el hilo salió del metodo
    45. eltosRellenos--;
    46. notifyAll();
    47.  
    48. return obj;
    49. }
    50. }