Está en la página 1de 6

Universidad Tecnológica Nacional – FC Carrera: Ingeniería en Sistemas de Información

Cátedra: Paradigmas de Programación Ejercicio 1 Productor/Consumidor


Autor: Ing. Nicolás Colacioppo Curso:2K1/Año:2008

Ejercicio de Paradigma Concurrente

La empresa de correo postal “Fast Mail” se dedica a la entrega de cartas a domicilio. Necesita simular los
procesos de negocios que en la misma se llevan a cabo y que se describen de la siguiente manera.
El cliente llega a intervalos aleatorios de entre 7 y 10 segundos, deja la carta en recepción, la cual es
depositada en un buzón. El buzón tiene capacidad para almacenar hasta 5 cartas simultáneamente. El
cartero retira una carta por vez del buzón, tardando entre 9 y 15 segundos en entregarla. Antes de
entregarla le coloca el sello de entregado a la misma, y luego informa que dicha carta se entregó
(exhibiendo el mensaje en un JTextArea).
Implementar la situación antes planteada en un JFrame, el cual deberá contener 1 JTextArea (para
exhibir los mensajes de los clientes y del cartero), y un botón “Iniciar” que al presionarlo inicialice la
ejecución de los hilos, y otro botón “Salir” que permita salir de la aplicación. Simular 10 entregas,
teniendo en cuenta que cada cliente solo podrá depositar una carta y que solo existe un cartero para la
repartición.

Resolución

Clase Carta

package pprprimerejconcurrencia;

/**
*@author Ing. Nicolás Colacioppo
*/
public class Carta
{
private static int nro=0;
private int codigo;
private String direccion;
private boolean entregado;
private static String dir[]={"Lombardo 111","Mexico 222","Pier 333"};

public Carta()
{
nro++; codigo=nro;
int i=(int)(Math.random()*3);
direccion=new String(dir[i]);
entregado=false;
}
public void entregar() {entregado=true;}
public boolean estadoCarta() {return entregado; }
public int getCodigo(){return codigo;}

public String toString()


{
String aux;
aux="\nCódigo de Carta: "+getCodigo()+"\nDirección:"+direccion+"\nEntregado:
"+estadoCarta();
return aux;
}
}//Fin clase Carta

Clase Recepcion

package pprprimerejconcurrencia;

import java.util.ArrayList;
import java.util.Iterator;

/**
*@author Ing. Nicolás Colacioppo
*/
public class Recepcion

1 de 6
Universidad Tecnológica Nacional – FC Carrera: Ingeniería en Sistemas de Información
Cátedra: Paradigmas de Programación Ejercicio 1 Productor/Consumidor
Autor: Ing. Nicolás Colacioppo Curso:2K1/Año:2008

private ArrayList buzon;


private boolean lleno;
private boolean vacio;
private int cantidad;

public Recepcion()
{
buzon=new ArrayList(5);
lleno=false;
vacio=true;
cantidad=0;
}

public synchronized void setCarta(Carta c)


{
while(cantidad==5)
{
try { wait();
}
catch(InterruptedException e){;}
}

buzon.add(c);
cantidad++;
vacio=false;
lleno=estaLleno();
this.notifyAll();
}

public synchronized Carta getCarta()


{
Carta aux=null;
while(cantidad==0)
{
try{ wait();
}
catch(InterruptedException e){;}
}

Iterator iter=buzon.iterator();
Carta c=null;

for (int i=0; i<5; i++) {


for(Object a : buzon){
if (a instanceof Carta) {
aux=(Carta)a;break;}
}
}
buzon.remove(aux);
cantidad--;

vacio=estaVacio();
lleno=false;
this.notifyAll();
return (Carta)aux;
}

private boolean estaLleno()


{
if(buzon.size()>=5)
return true;
else
return false;
}

private boolean estaVacio()


{

2 de 6
Universidad Tecnológica Nacional – FC Carrera: Ingeniería en Sistemas de Información
Cátedra: Paradigmas de Programación Ejercicio 1 Productor/Consumidor
Autor: Ing. Nicolás Colacioppo Curso:2K1/Año:2008

if(buzon.isEmpty())
return true;
else
return false;
}

}//fin clase Recepcion

Clase Cliente

package pprprimerejconcurrencia;

import java.awt.*;
import javax.swing.*;
/**
*@author Ing. Nicolás Colacioppo
*/
public class Cliente extends Thread
{
private Recepcion rec;
private JTextArea mensaje;

public Cliente(Recepcion rec,JTextArea mensaje)


{
this.rec=rec; this.mensaje=mensaje;
}

public void run()


{
Carta c;
int tiempo;
tiempo=(int)(Math.random()*3000+7000);
try{
sleep(tiempo);
}
catch(InterruptedException e)
{
//System.out.println(e.toString());
}
c=new Carta();
rec.setCarta(c);
synchronized(mensaje)
{
mensaje.append("\n\nCliente deposita carta: "+c.toString());
}
}//fin método run()

}//fin Cliente

Clase Cartero

package pprprimerejconcurrencia;

import java.awt.*;
import javax.swing.*;
/**
*@author Ing. Nicolás Colacioppo
*/
public class Cartero extends Thread
{
private Recepcion rec;
private JTextArea mensaje;

public Cartero(Recepcion rec,JTextArea mensaje)


{

3 de 6
Universidad Tecnológica Nacional – FC Carrera: Ingeniería en Sistemas de Información
Cátedra: Paradigmas de Programación Ejercicio 1 Productor/Consumidor
Autor: Ing. Nicolás Colacioppo Curso:2K1/Año:2008

this.rec=rec; this.mensaje=mensaje;
}

public void run()


{
Carta c;
int tiempo;
for(int i=0;i<10;i++)
{
tiempo=(int)(Math.random()*600+1500);
try{ sleep(tiempo);}
catch(InterruptedException e)
{
//System.out.println(e.toString());
}
c=rec.getCarta();
if(c==null)
mensaje.append("\n\nCartero no pudo entregar su carta");
c.entregar();
synchronized(mensaje)
{
mensaje.append("\n\nCartero entrega carta: "+c.toString());
}
c=null;
}//fin for

JOptionPane.showMessageDialog(null, "Finalización de la simulación",


"Información", 1);
}//fin método run()

}//fin Cartero

Clase Aplicacion

package pprprimerejconcurrencia;

import java.util.ArrayList;
import java.util.Iterator;
/**
*
* @author Nicolás
*/
public class Aplicacion extends javax.swing.JFrame {

private Recepcion recepcion;


private Cartero cartero;
private ArrayList clientes;

/** Creates new form Aplicacion */


public Aplicacion() {

initComponents();
recepcion=new Recepcion();
cartero=null;
clientes=new ArrayList(10);

setTitle("Simulación de procesos de depósito y entrega de cartas, Fast Mail");


}

/** This method is called from within the constructor 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">
private void initComponents() {

jScrollPane1 = new javax.swing.JScrollPane();

4 de 6
Universidad Tecnológica Nacional – FC Carrera: Ingeniería en Sistemas de Información
Cátedra: Paradigmas de Programación Ejercicio 1 Productor/Consumidor
Autor: Ing. Nicolás Colacioppo Curso:2K1/Año:2008

jTextArea1 = new javax.swing.JTextArea();


jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

jTextArea1.setColumns(20);
jTextArea1.setRows(5);
jScrollPane1.setViewportView(jTextArea1);

jButton1.setText("Iniciar");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});

jButton2.setText("Salir");
jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());


getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(70, 70, 70)
.addComponent(jButton1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 105,
Short.MAX_VALUE)
.addComponent(jButton2)
.addGap(111, 111, 111))
.addGroup(layout.createSequentialGroup()
.addGap(18, 18, 18)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 360,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(22, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addGap(25, 25, 25)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 144,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 55,
Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BA
SELINE)
.addComponent(jButton1)
.addComponent(jButton2))
.addGap(53, 53, 53))
);

pack();
}// </editor-fold>

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {


// TODO add your handling code here:
cartero=new Cartero(recepcion,jTextArea1);
for(int i=0;i<10;i++)
{
clientes.add(new Cliente(recepcion,jTextArea1));
}

cartero.start();
Iterator iter=clientes.iterator();

5 de 6
Universidad Tecnológica Nacional – FC Carrera: Ingeniería en Sistemas de Información
Cátedra: Paradigmas de Programación Ejercicio 1 Productor/Consumidor
Autor: Ing. Nicolás Colacioppo Curso:2K1/Año:2008

Cliente c=null;
while(iter.hasNext())
{
c=(Cliente)iter.next();
c.start();
}
jButton1.setEnabled(false);
}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {


// TODO add your handling code here:
dispose();
System.exit(0);
}

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Aplicacion().setVisible(true);
}
});
}

// Variables declaration - do not modify


private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea jTextArea1;
// End of variables declaration

6 de 6

También podría gustarte