Productor consumidor

CLASE PRINCIPAL

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package productor_consumidor;

/**
 *
 * @author glop
 */
public class Productor_consumidor {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       Buffer bu = new Buffer(); //Instalcia del objeto Buffer
       productor pro = new productor(bu); // Instancia del objeto productor
       consumidor con = new consumidor(bu); // Instancia del objeto consumidor
      
       // Se lanzan los hilos
       pro.start();
       con.start();
      
    }
}

CLASE BUFFER

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package productor_consumidor;


/**
 * Clase del objeto Buffer
 * @author glop
 */
public class Buffer {
   
    char conten[] = new char[6]; // Array de char con 6 posiciones
    public int capacidad=0; // Variable que almacena la capacidad del Buffer, se inicia con 0 y el máximo es 6
   
   
    // Se construye el objeto Buffer y se dan valores char vacío al array
    public Buffer() {
       conten[0] = ' ';
       conten[1] = ' ';
       conten[2] = ' ';
       conten[3] = ' ';
       conten[4] = ' ';
       conten[5] = ' ';
    }
   
    // Método sincronizado que deposita un caracter en el buffer
    public synchronized void deposita(char caract) {
       
        // La estructura while indica que el hilo debe esperar si no hay capacidad para más caracteres.
        while(capacidad==5) {
            try {
                wait();
            } catch(InterruptedException ex) {
           
            }
                }
       
         // Se recorre el array el búsqueda de elementos vacío en los que depositar el caracter
            for (int c=0;c<conten.length;c++) {
                if (conten[c]==' ') {
                    conten[c] = caract;
                    capacidad = capacidad + 1;
                    break; // En el momento que encuentre un caracter vacío, se puede salir del bucle
                }
            }
            notify(); // Se notifica a los demás hilo que acabó la operación
    }
   
   
    // Método sincronizado que recoge el caracter. Devuelve el caracter obtenido
    public synchronized char recoge() {
        char letra=' ';
       
        // Si no hay nada que recoger, el hilo espera
        while(capacidad==0) {
            try {
                wait();
            } catch(InterruptedException ex) {
           
            }
        }
       
        // Se recorre el array en búsqueda de elementos que tengan algún contenido.
        for (int c=0;c<conten.length;c++) {
            if (conten[c]!=' ') {
                letra = conten[c]; // Almacena en la variable letra lo contenido en el elemento.
                conten[c] = ' '; // Se borra el elemento ya que se ha extraído el caracter que tenía
                capacidad = capacidad - 1;
                break; // Cuando se ha extraído el elemento, se puede salir del bucle
            }
        }
       
        notify(); // Notifica a los demás hilos que acabó la acción
        return letra; // Devuelve el caracter obtenido
       
    }
}

CLASE HILO PRODUCTOR

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package productor_consumidor;


/**
 * Clase del objeto productor
 * @author glop
 */
public class productor extends Thread {
   
    private final String caracteres = "abcdefghijklmnñopqrstuvwxyz"; // String con las letras de abecedario
    private Buffer buffer; // Instancia del objeto buffer
   
    // Se construye el objeto productor pasando como parámetro un objeto Buffer
    public productor(Buffer buff) {
        this.buffer = buff;
    }
   
    public void run() {
       
        // Se realiza un bucle 15 veces según lo pedido en la tarea
        for (int c=0;c<15;c++) {
        char l=caracteres.charAt((int)(Math.random()*caracteres.length()));; // Se genera aleatoriomente un caracter
        buffer.deposita(l); // Se deposita en buffer
        System.out.println("Depositado el caracter " + l + " en el buffer"); // Salidad por pantalla
        try {
                sleep(100);
            } catch(InterruptedException ex) {
           
            }
        }
        }
       
    }

CLASE HILO CONSUMIDOR

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package productor_consumidor;


/**
 * Clase del objeto consumidor
 * @author glop
 */
public class consumidor extends Thread {
   
    private Buffer buffer; // Instancia del objeto Buffer
   
    // Se construye el objeto consumidor pasando por parámetro un objeto Buffer
    public consumidor(Buffer buff) {
        this.buffer = buff;
    }
   
    public void run() {
       
        // Se realiza un bucle 15 veces según lo pedido en la tarea
        for (int c=0;c<15;c++) {
        char l;
        l = buffer.recoge(); // Se almacena en una variable char el caracter obtenido de la recogida del buffer
        System.out.println("Recogido el caracter " + l + " en el buffer"); // Salida por pantalla
        try {
                sleep(100);
            } catch(InterruptedException ex) {
           
            }
        }
        }
       
    }