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) {
}
}
}
}