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:

![]()
Atte
Ruben Bocanegra
Me avisan como les fue con sus comentarios, gracias!
gracias, necesitaba un ejemplo de progres y casualidad que
estoy estudiando semaforos e hilos, jeje
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
Hey gracias por agregar ese codigo. Tengo un problema puesto que me pide el main method, sugerencias? =/
nevermind ya corrió, gracias!
Gracias men, me salvaste. Saludos.
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.