Productor Consumidor en JAVA con progress bar

Un amigo mio estaba como loco buscando un ejemplo en la web de de multiples productores y multiples consumidores con barra de progreso para presentarlo en su clase de sistemas operativos la verdad es que yo no lo veo muy complicado para la parte de consola a la parte gráfica usando el netbeans o el eclipse lo que sea. Bueno en fin, para los desesperados les juego el código a fin de que en sus cursillo de Universidad no tengan que pagarle 20 dolares al amigo para que les haga el trabajito, y asi a ustedes les salga.

Se que este Post será ayuda, asi que una forma de retribuir esa ayuda, es visitando los Sitios Recomendados que aparecen a la izquierda del post o la publicidad ya que ellos proveen información relacionada al post presente y darán mayor presencia al Blog de su servidor…

Además pueden recomendar este Blog en delicius o cualquier otra red social que encuentre, tambien seria bueno que compartan sus experiencias a través de sus comentarios.

Seguimos:
Que necesitan, tener instalado el JDK version 5 o 6, yo use el netbeans 5 o 6 (da igual), y estas son las fuentes:

No sobra decir que el paquete se llama GUI ( por que como es gráfico).

 

Y estas son las fuentes ¡Lo que esperaban

1er Archivo:Pantalla.java


/*
* NewApplet.java
*
* Created on 6 de abril de 2006, 10:53 AM
*/

package gui;

public class pantalla extends java.applet.Applet {

//Vector de productores y consumidores
Productor vproductor[] = new Productor[30];
Consumidor vconsumidor[] = new Consumidor[30];
Tuberia tuberia;
public int np =2;//numero de productores
public int nc =1;//numero de consumidores
public int producido = 0;

public void init() {
try {
java.awt.EventQueue.invokeAndWait(new Runnable() {
public void run() {
initComponents();
}
});
} catch (Exception ex) {
ex.printStackTrace();
}
}

public void set_textArea(String texto){
this.txt_output.setText(this.txt_output.getText()+"\n"+texto);
}//function

public void set_progreso(int prog){
this.progreso.setValue(prog);
}//function

/** This method is called from within the init() method to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
private void initComponents() {
txt_nc = new javax.swing.JTextField();
btn_correr = new javax.swing.JButton();
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
txt_np = new javax.swing.JTextField();
jLabel3 = new javax.swing.JLabel();
txt_vc = new javax.swing.JTextField();
txt_vp = new javax.swing.JTextField();
jLayeredPane1 = new javax.swing.JLayeredPane();
jLayeredPane2 = new javax.swing.JLayeredPane();
jLabel4 = new javax.swing.JLabel();
txt_output = new java.awt.TextArea();
btn_velocidad = new javax.swing.JButton();
jLabel6 = new javax.swing.JLabel();
progreso = new javax.swing.JProgressBar();

setLayout(null);

setBackground(new java.awt.Color(255, 255, 204));
txt_nc.setName("txt_nc");
txt_nc.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
txt_ncActionPerformed(evt);
}
});

add(txt_nc);
txt_nc.setBounds(130, 50, 50, 20);

btn_correr.setText("Correr");
btn_correr.setName("bnt_correr");
btn_correr.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btn_correrActionPerformed(evt);
}
});

add(btn_correr);
btn_correr.setBounds(210, 50, 120, 50);

jLabel1.setText("Consumidores");
add(jLabel1);
jLabel1.setBounds(10, 50, 130, 20);

jLabel2.setText(" Productores");
add(jLabel2);
jLabel2.setBounds(10, 90, 140, 20);

txt_np.setName("txt_np");
txt_np.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
txt_npActionPerformed(evt);
}
});

add(txt_np);
txt_np.setBounds(130, 90, 50, 20);

jLabel3.setText("Velocidad");
add(jLabel3);
jLabel3.setBounds(350, 30, 80, 14);

txt_vc.setName("txt_vc");
add(txt_vc);
txt_vc.setBounds(350, 50, 50, 20);

txt_vp.setName("txt_vp");
add(txt_vp);
txt_vp.setBounds(350, 80, 50, 20);

add(jLayeredPane1);
jLayeredPane1.setBounds(330, 50, 0, 0);

add(jLayeredPane2);
jLayeredPane2.setBounds(300, 70, 0, 0);

jLabel4.setFont(new java.awt.Font("Verdana", 1, 14));
jLabel4.setForeground(new java.awt.Color(51, 51, 51));
jLabel4.setText("Productor Consumidor con Buffer Limitado");
add(jLabel4);
jLabel4.setBounds(10, 10, 340, 15);

txt_output.setFont(new java.awt.Font("Verdana Ref", 0, 12));
add(txt_output);
txt_output.setBounds(20, 150, 570, 310);

btn_velocidad.setText("Fijar velocidad");
btn_velocidad.setName("bnt_correr");
btn_velocidad.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btn_velocidadActionPerformed(evt);
}
});

add(btn_velocidad);
btn_velocidad.setBounds(420, 50, 160, 50);

jLabel6.setText("Valor del Buffer = 25 caracteres");
add(jLabel6);
jLabel6.setBounds(10, 120, 340, 14);

progreso.setMaximum(24);
progreso.setName("progreso");
add(progreso);
progreso.setBounds(20, 470, 570, 50);

}
// </editor-fold>//GEN-END:initComponents

private void btn_velocidadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_velocidadActionPerformed
//fijamos los valores de las velocidades
int vc , vp ;

if(this.txt_vc.getText()==""){
vc = 500;
}else{
vc = Integer.parseInt(this.txt_vc.getText());
}
if(this.txt_vp.getText()==""){
vp = 500;
}else{
vp = Integer.parseInt(this.txt_vp.getText());
}

for(int i = 0; i<Integer.parseInt(this.txt_np.getText()); i++){
vproductor[i].set_duerme(vp);
}//for
for(int i = 0; i<Integer.parseInt(this.txt_nc.getText()); i++){
vconsumidor[i].set_duerme(vc);
}//for
}//GEN-LAST:event_btn_velocidadActionPerformed

private void btn_correrActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_correrActionPerformed

tuberia = new Tuberia(this);

//controlamos la cantidad de productores y consumidores
if(this.txt_np.getText()==""){
np = 0;
}else{
np = Integer.parseInt(this.txt_np.getText());
}
if(this.txt_nc.getText()==""){
nc = 0;
}else{
nc = Integer.parseInt(this.txt_nc.getText());
}

for(int i = 0; i< nc; i++){
vconsumidor[i] = new Consumidor(tuberia,this,i+1);
vconsumidor[i].start();
}//for
for(int i = 0; i<np; i++){
vproductor[i] = new Productor(tuberia,this,i+1);
vproductor[i].start();
}//for

}//GEN-LAST:event_btn_correrActionPerformed

private void txt_npActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txt_npActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_txt_npActionPerformed

private void txt_ncActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txt_ncActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_txt_ncActionPerformed

// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btn_correr;
private javax.swing.JButton btn_velocidad;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel6;
private javax.swing.JLayeredPane jLayeredPane1;
private javax.swing.JLayeredPane jLayeredPane2;
private javax.swing.JProgressBar progreso;
private javax.swing.JTextField txt_nc;
private javax.swing.JTextField txt_np;
private java.awt.TextArea txt_output;
private javax.swing.JTextField txt_vc;
private javax.swing.JTextField txt_vp;
// End of variables declaration//GEN-END:variables

}

2do Archivo:Tuberia.java (Que es el monitor)


package gui;

class Tuberia {
private char buffer[] = new char[25];
public int siguiente = 0;
// Flags para saber el estado del buffer
private boolean estaLlena = false;
private boolean estaVacia = true;
public String alfabeto = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//es el buffer que compartiran
public int max_buffer=25;//maxima cantidad del buffer
private pantalla pan;
public Tuberia(pantalla p){
this.pan = p;//esta es la pantalla
}

// Método para retirar letras del buffer
public synchronized void recoger(int nombre ){
// No se puede consumir si el buffer está vacío
while( estaVacia == true )
{
try {
wait(); // Se sale cuando estaVacia cambia a false
} catch( InterruptedException e ) {
;
}
}
// Decrementa la cuenta, ya que va a consumir una letra
siguiente--;
this.pan.set_textArea("Consumidor "+nombre+"->Recogiendo "+buffer[siguiente]+" de la Tuberia ");
this.pan.set_progreso(siguiente);
// Comprueba si se retiró la última letra
if( siguiente == 0 ){
estaVacia = true;
this.pan.set_textArea("El buffer esta vacio");
}//if

// El buffer no puede estar lleno, porque acabamos de consumir
estaLlena = false;
notify();
}//fin de la funcion

// Método para añadir letras al buffer
public synchronized void lanzar( char c , int nombre) {
// Espera hasta que haya sitio para otra letra
while( estaLlena == true)
{
try {
wait(); // Se sale cuando estaLlena cambia a false
} catch( InterruptedException e ) {
;
}
}
// Añade una letra en el primer lugar disponible
buffer[siguiente] = c;
this.pan.set_textArea("Productor "+nombre+"->Lanzando "+c+" a la tuberia.");
this.pan.set_progreso(siguiente);
// Cambia al siguiente lugar disponible
siguiente++;
// Comprueba si el buffer está lleno
if( siguiente == this.max_buffer){
estaLlena = true;
this.pan.set_textArea("El buffer esta lleno");
}//if
estaVacia = false;
notify();
}//funcion
}//clase

3er Archivo : Productor.java


package gui;

class Productor extends Thread {
private Tuberia tuberia;
private pantalla pan;
private int nombre;
private int duerme = 1000;
public Productor( Tuberia t , pantalla pan, int nombre) {
// Mantiene una copia propia del objeto compartido
tuberia = t;
this.pan = pan;
this.nombre = nombre;

}

public void run() {
char c;

while(true){
c = tuberia.alfabeto.charAt( (int)(Math.random()*26 ) );
tuberia.lanzar( c , nombre);
// Imprime un registro con lo añadido
// Espera un poco antes de añadir más letras
try {
sleep(this.duerme);
} catch( InterruptedException e ) {
;
}
}//fin del for
}//fin del void run

public void set_duerme(int duerme){
this.duerme = duerme;
}//function

}//fin de la clase

y 4to archivo: Consumidor.java


class Consumidor extends Thread {
private Tuberia tuberia;
private pantalla pan;
private int nombre;
private int duerme= 1000;
public Consumidor(Tuberia t , pantalla pan, int nombre) {
// Mantiene una copia propia del objeto compartido
tuberia = t;
this.pan = pan;
this.nombre = nombre;
}

public void run() {
char c;
// Consume letras de la tubería
while(true ){
tuberia.recoger(nombre);
// Espera un poco antes de coger más letras
try {
sleep(this.duerme);
} catch( InterruptedException e ) {
;
}
}//fin del while
}//fin de la funcion run

public void set_duerme(int duerme){
this.duerme = duerme;
}//function
}//class

Bueno como dice el conejo Bugs, eso es todo amigos, no se olviden de hacerle un run a la pantalla.java, por que es de ahí de donde arranca el programa, y una muestra de que si funciona:

 

Archivos

corriendo productor consumidor

Atte

Ruben Bocanegra

Me avisan como les fue con sus comentarios, gracias!

This entry was posted on Wednesday, February 13th, 2008 at 1:41 am and is filed under Java. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

6 Responses to “Productor Consumidor en JAVA con progress bar”

  1. Klaus on April 30th, 2008 at 1:31 pm

    gracias, necesitaba un ejemplo de progres y casualidad que
    estoy estudiando semaforos e hilos, jeje

  2. zailly on September 6th, 2008 at 1:35 pm

    gracias porque justo me dejaron ese trabajo..= muchas gracias por todo..te cuento como me fur despues porque aun no lo pruebo, espero me corra…
    zz

  3. Jorge on October 1st, 2008 at 2:12 pm

    Hey gracias por agregar ese codigo. Tengo un problema puesto que me pide el main method, sugerencias? =/

  4. Jorge on October 1st, 2008 at 5:03 pm

    nevermind ya corrió, gracias!

  5. Hector Botello on October 8th, 2008 at 11:38 am

    Gracias men, me salvaste. Saludos.

  6. nelson can on November 19th, 2008 at 5:15 am

    hola buen dia, me gustaria ver la opcion de que me ayudaras con un ejercio en java en cuak consta de:

    Desarrollar una aplicación Productores/Consumidores usando hilos y monitores de JAVA.

    Su aplicación debe recibir como parámetros el número de productores y consumidores que serán creados por el main y la cantidad de iteraciones que ejecutará cada hilo (tanto productor como consumidor).

    - El número de Productores y Consumidores no puede ser cero (0)
    - El número de iteraciones debe ser mayor de 1.
    - Los productores y consumidores comparten un buffer de 100 posiciones para almacenar mensajes de texto.
    - Cada productor debe escribir un mensaje de la siguiente manera:
    Hilo Productor i Escribe mensaje j

    - Cada Consumidor lee un mensaje del Buffer e imprime en pantalla lo siguiente:
    Hilo Consumidor i lee el mensaje: [el mensaje que leyo]

    - El valor de i representa el identificador del Productor y Consumidor respectivamente y el valor de j representa el número del mensaje.

Leave a Reply