Concurrencia e Hilos con Java
 


 

  1. Introducción
  2. Objetivo del Caso de Estudio
  3. Descripción del Problema Planteado
  4. Descripción de los Algoritmos Utilizados
  5. Programa Desarrollado
  6. Datos y Ejecuciones
  7. Resultados y Conclusiones
  8. Fin


Introducción

Para el desarrollo del presente caso de estudio se ha utilizado el lenguaje Java, una muy poderosa herramienta para el desarrollo orientado a objetos, la utilización a través de Internet, el desarrollo multiplataforma y especialmente para la explotación de la concurrencia a nivel de programa, mediante la utilización de hilos de ejecución o procesos ligeros, según se los designa en la bibliografía existente [25, Tanenbaum] y [20, Castillo, Cobo, Gómez y Solares].

Los hilos o procesos ligeros son una parte de código o miniprograma que puede ser ejecutada independientemente, de forma que una aplicación o un applet puede tener varios hilos ejecutándose simultáneamente y efectuando distintas tareas; estos hilos se encuentran dentro de un programa y son parte de él.

Los hilos, a veces también llamados contextos de ejecución, pueden ser utilizados para la implementación de algoritmos paralelos o procesos concurrentes, sin ser necesario disponer de equipos con estructura de multiprocesador. En el caso de un solo procesador, los procesos ligeros incorporan mecanismos para compartirlo, estableciéndose prioridades
entre ellos y también facilidades de sincronización, cuando es necesario.

Los aspectos teóricos relacionados con los hilos (threads) han sido desarrollados en el Capítulo “Procesos y Procesadores en Sistemas Distribuidos”.

Inicio:   Fin:

Objetivo del Caso de Estudio

Conforme a lo antes indicado, el objetivo del caso de estudio desarrollado fue el de programar una aplicación con Java (Hilos.java) que implementara el problema de “procesos productores y consumidores” y que permitiera generar un archivo reutilizable de seguimiento (Hilos.txt y su versión formateada Hilos.dat) y posteriormente efectuar análisis de la forma en que se ha desarrollado la ejecución concurrente de los hilos y la sincronización de los mismos, que es el verdadero objetivo, más allá de la utilización como ejemplo del problema de productores y consumidores.

Inicio:   Fin:

Descripción del Problema Planteado

Una descripción detallada del problema de los hilos de ejecución puede consultarse en el Capítulo “Procesos y Procesadores en Sistemas Distribuidos”, siendo especialmente pertinentes los temas relacionados con Introducción a los Hilos, Uso de Hilos, Aspectos del Diseño de un Paquete de Hilos e Implantación de un Paquete de Hilos.

Inicio:   Fin:

Descripción de los Algoritmos Utilizados

Al igual que en el apartado anterior, una descripción detallada de los fundamentos teóricos de los algoritmos aplicables a este caso, puede consultarse en el Capítulo “Procesos y Procesadores en Sistemas Distribuidos”, siendo especialmente pertinentes los temas sobre Aspectos del Diseño de un Paquete de Hilos e Implantación de un Paquete de Hilos [25, Tanenbaum].

Respecto del algoritmo de productores y consumidores utilizado como base para el desarrollo del programa del caso de estudio, puede ser consultado en los ejemplos sobre el tema de [20, Castillo, Cobo, Gómez y Solares] y además en [23, Tanenbaum].

Los principales aspectos del algoritmo desarrollado son los siguientes:


Inicio:   Fin:

Programa Desarrollado

El programa en Java desarrollado se encuentra en el archivo Hilos.java y posee las siguientes características:

Se lo puede invocar mediante “java Hilos” y recibe como entradas por pantalla los datos de configuración de la simulación referidos a:

Respecto del archivo generado, el mismo tendrá un tamaño variable según los datos que se hayan suministrado a la ejecución que lo produce, especialmente el tiempo de ejecución; es preciso señalar además que el archivo es reutilizable, es decir que se borra automáticamente al iniciar cada ejecución.

El código del programa desarrollado (Hilos.java) es el siguiente:

// Trabajo práctico parte de la Tesis de la Maestría en Informática y
// Computación - 2000. David Luis la Red Martínez.
//
// Ejemplo de concurrencia e hilos con JAVA.
//
// El ejemplo contempla el problema de productores / consumidores:
// * Los hilos productores graban (y ocupan) buffers en un pool de buffers disponibles.
// * Los hilos consumidores leen (y liberan) buffers del pool de buffers disponibles.
//
import java.io.*;
import java.util.*;
import java.util.Date;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.applet.*;
import java.applet.Applet;
import java.math.*;
import java.text.*;
import java.lang.String;
import java.lang.*;
public class Hilos extends Frame
implements ActionListener {
VentanaDialogCH ventana;
SimpleDialogCH dialog;
TextArea textArea;
Button boton1;
public Hilos() {
MenuBar barra;
Menu cargadatos, ayuda, acerca, salir;
MenuItem cardatos, ejecuc, listaeje, ayulis, acercade, fin;
// Menú principal.
barra = new MenuBar();
setMenuBar(barra);
// Agregado de submenú al principal.
cargadatos = new Menu(”Configuración y Ejecución”, true);
barra.add(cargadatos);
// Creación de opciones del menú.
cardatos = new MenuItem(”Datos de Configuración”);
cardatos.addActionListener(this);
cargadatos.add(cardatos);
ejecuc = new MenuItem(”Ejecución Concurrente e Hilos”);
ejecuc.addActionListener(this);
cargadatos.add(ejecuc);
listaeje = new MenuItem(”Lista Resultados de Ejecución”);
listaeje.addActionListener(this);
cargadatos.add(listaeje);
// Agregado del submenú al principal.
ayuda = new Menu(”Ayuda”, true);
barra.add(ayuda);
// Creación de opciones del menú.
ayulis = new MenuItem(”Listar Ayuda”);
ayulis.addActionListener(this);
ayuda.add(ayulis);
// Agregado del submenú al principal.
salir = new Menu(”Salir”, true);
barra.add(salir);
// Creación de opciones del menú.
fin = new MenuItem(”Salir del Sistema”);
fin.addActionListener(this);
salir.add(fin);
// Agregado del submenú al principal.
acerca = new Menu(”Acerca de”, true);
barra.add(acerca);
// Creación de opciones del menú.
acercade = new MenuItem(”Acerca del Sistema”);
acercade.addActionListener(this);
acerca.add(acercade);
// Habilitación del cierre de la ventana.
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public void actionPerformed(ActionEvent evt) {
MenuItem c = (MenuItem) evt.getSource();
String arg = c.getLabel();
if(arg.equals(”Salir del Sistema”)) {
System.exit(0);
}
else if(arg.equals(”Datos de Configuración”)) {
// Para Datos de Configuración.
// Lee datos de entrada.
// Crea etiqueta para documento.
VentanaDialogCH ventana=new VentanaDialogCH();
ventana.setTitle(”Carga de Datos de Configuración”);
ventana.setVisible(true);
ventana.setBackground(Color.yellow);
ventana.setForeground(Color.red);
ventana.setSize(new Dimension(600,400));
}
else if(arg.equals(”Ejecución Concurrente e Hilos”)) {
// Para Ejecución Concurrente e Hilos.
// Lee datos de entrada.
// Crea etiqueta para documento.
VentanaDialogECH ventana=new VentanaDialogECH();
ventana.setTitle(”Realiza Ejecución Concurrente e Hilos”);
ventana.setVisible(true);
ventana.setBackground(Color.red);
ventana.setForeground(Color.yellow);
ventana.setSize(new Dimension(600,400));
}
else if(arg.equals(”Lista Resultados de Ejecución”)) {
// Para Lista Resultados de Ejecución.
// Lee datos de entrada.
// Crea etiqueta para documento.
VentanaDialogLCH ventana=new VentanaDialogLCH();
ventana.setTitle(”Lista Resultados de Ejecución Concurrente e Hilos”);
ventana.setVisible(true);
ventana.setBackground(Color.green);
ventana.setForeground(Color.orange);
ventana.setSize(new Dimension(600,400));
}
else if(arg.equals(”Listar Ayuda”)) {
// Para Listar Ayuda.
// Lee datos de entrada.
// Crea etiqueta para Listar Ayuda.
VentanaDialogA ventana=new VentanaDialogA();
ventana.setTitle(”Lista Ayuda”);
ventana.setVisible(true);
ventana.setBackground(Color.cyan);
ventana.setForeground(Color.magenta);
ventana.setSize(new Dimension(600,400));
}
else if(arg.equals(”Acerca del Sistema”)) {
// Para Acerca del Sistema.
// Lee datos de entrada.
// Crea etiqueta para Acerca del Sistema.
VentanaDialogAS ventana=new VentanaDialogAS();
ventana.setTitle(”Acerca del Sistema”);
ventana.setVisible(true);
ventana.setBackground(Color.orange);
ventana.setForeground(Color.blue);
ventana.setSize(new Dimension(600,400));
}
}
public static void main (String args[]) {
// Creación del menú principal.
Hilos menus = new Hilos();
menus.setTitle(”Ejecución Concurrente e Hilos con JAVA”);
menus.setVisible(true);
menus.setBackground(Color.cyan);
menus.setSize(new Dimension(850,650));
// Creación de la imágen dinámica.
VImaCanvas imagen1 = new VImaCanvas();
imagen1.setTitle(”???????”);
imagen1.setVisible(true);
imagen1.setBackground(Color.orange);
imagen1.setSize(new Dimension(100,100));
}
}
class VentanaDialogCH extends Frame implements ActionListener{
SimpleDialogCH dialog;
TextArea textArea;
Button boton1;
public VentanaDialogCH(){
textArea=new TextArea(5,40);
textArea.setEditable(false);
add(”Center”,textArea);
boton1=new Button(”Diálogo p/ configuración”);
boton1.addActionListener(this);
Panel panel=new Panel();
panel.add(boton1);
add(”South”,panel);
panel.setBackground(Color.yellow);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
setVisible(false);
}});
}
public void actionPerformed(ActionEvent evt){
String str=evt.getActionCommand();
if(str.equals(”Diálogo p/ configuración”)){
if(dialog==null)
dialog=new SimpleDialogCH(this,”Configuración”);
dialog.show();
}
}
public void setText1(String stock){
try {
textArea.setFont(new Font(”Times”, 1, 11));
textArea.setForeground(Color.orange);
String asterisc = ”\n*************************************”;
textArea.append(asterisc);
textArea.append(”\nNúmero inicial de bu¤ers ocupados: ” + stock + ”.”);
}
catch (java.lang.Exception ex) {
// Atrapa excepciones y las despliega.
ex.printStackTrace ();
}
try {
File f0 = new File (”Hilos.txt”);
f0.delete();
RandomAccessFile f1 = new RandomAccessFile (”Hilos.txt”, ”rw”);
long longitud;
longitud = 0;
f1.seek(longitud);
f1.writeUTF(stock);
f1.close();
}
catch (Exception e) {
System.out.println(”Archivo Hilos: Salida en grabación de parámetros: ” + e);
}
}
public void setText2(String maxcompra){
try {
textArea.append(”\nNúmero máximo de bu¤ers leidos por vez: ” + maxcompra + ”.”);
}
catch (java.lang.Exception ex) {
// Atrapa excepciones y las despliega.
ex.printStackTrace ();
}
try {
RandomAccessFile f1 = new RandomAccessFile (”Hilos.txt”, ”rw”);
long longitud;
longitud = f1.length();
f1.seek(longitud);
f1.writeUTF(maxcompra);
f1.close();
}
catch (Exception e) {
System.out.println(”Archivo Hilos: Salida en grabación de parámetros: ” + e);
}
}
public void setText3(String limitereponer){
try {
textArea.append(”\nNúmero mínimo de bu¤ers ocupados antes de grabar más: ” +
limitereponer + ”.”);
}
catch (java.lang.Exception ex) {
// Atrapa excepciones y las despliega.
ex.printStackTrace ();
}
try {
RandomAccessFile f1 = new RandomAccessFile (”Hilos.txt”, ”rw”);
long longitud;
longitud = f1.length();
f1.seek(longitud);
f1.writeUTF(limitereponer);
f1.close();
}
catch (Exception e) {
System.out.println(”Archivo Hilos: Salida en grabación de parámetros: ” + e);
}
}
public void setText4(String cantidadreponer){
try {
textArea.append(”\nNúmero de bu¤ers grabados por vez: ” + cantidadreponer + ”.”);
}
catch (java.lang.Exception ex) {
// Atrapa excepciones y las despliega.
ex.printStackTrace ();
}
try {
RandomAccessFile f1 = new RandomAccessFile (”Hilos.txt”, ”rw”);
long longitud;
longitud = f1.length();
f1.seek(longitud);
f1.writeUTF(cantidadreponer);
f1.close();
}
catch (Exception e) {
System.out.println(”Archivo Hilos: Salida en grabación de parámetros: ” + e);
}
}
public void setText5(String tiempoapertura){
try {
String asterisc = ”\n*************************************”;
textArea.append(”\nNúmero de milisegundos de la simulación: ” + tiempoapertura +
”.”);
textArea.append(asterisc);
textArea.append(”\n ”);
}
catch (java.lang.Exception ex) {
// Atrapa excepciones y las despliega.
ex.printStackTrace ();
}
try {
RandomAccessFile f1 = new RandomAccessFile (”Hilos.txt”, ”rw”);
long longitud;
longitud = f1.length();
f1.seek(longitud);
f1.writeUTF(tiempoapertura);
f1.close();
}
catch (Exception e) {
System.out.println(”Archivo Hilos: Salida en grabación de parámetros: ” + e);
}
}
}
class SimpleDialogCH extends Dialog implements ActionListener{
TextField tstock, tmaxcompra, tlimitereponer, tcantidadreponer, ttiempoapertura;
VentanaDialogCH parent;
Button b1;
public String stock;
public String MAXCOMPRA;
public String LIMITEREPONER;
public String CANTIDADREPONER;
public String TIEMPOAPERTURA;
public SimpleDialogCH(Frame fr,String titulo){
super(fr,titulo,true);
parent=(VentanaDialogCH)fr;
Panel p1=new Panel();
Label etiqueta1=new Label(”Número inicial de buffers ocupados (0):”);
p1.add(etiqueta1);
tstock=new TextField(”0”,4);
p1.add(tstock);
add(”Center”,p1);
Label etiqueta2=new Label(”Número máximo de buffers leidos por vez (30):”);
p1.add(etiqueta2);
tmaxcompra=new TextField(”30”,4);
p1.add(tmaxcompra);
add(”Center”,p1);
Label etiqueta3=new Label(”Número mínimo de buffers ocupados antes de grabar más (40):”);
p1.add(etiqueta3);
tlimitereponer=new TextField(”40”,4);
p1.add(tlimitereponer);
add(”Center”,p1);
Label etiqueta4=new Label(”Número de buffers grabados por vez (50):”);
p1.add(etiqueta4);
tcantidadreponer=new TextField(”50”,4);
p1.add(tcantidadreponer);
add(”Center”,p1);
Label etiqueta5=new Label(”Número de milisegundos de la ejecución (2000):”);
p1.add(etiqueta5);
ttiempoapertura=new TextField(”2000”,4);
p1.add(ttiempoapertura);
add(”Center”,p1);
Panel p2=new Panel();
p2.setLayout(new FlowLayout(FlowLayout.RIGHT));
b1=new Button(”Cancelar”);
b1.addActionListener(this);
Button b2=new Button(”Aceptar”);
b2.addActionListener(this);
p2.add(b1);
p2.add(b2);
add(”South”,p2);
setSize(500,200);
}
public void actionPerformed(ActionEvent evt){
String str=evt.getActionCommand();
if(str.equals(”Aceptar”))
parent.setText1(tstock.getText());
stock = tstock.getText();
parent.setText2(tmaxcompra.getText());
MAXCOMPRA = tmaxcompra.getText();
parent.setText3(tlimitereponer.getText());
LIMITEREPONER = tlimitereponer.getText();
parent.setText4(tcantidadreponer.getText());
CANTIDADREPONER = tcantidadreponer.getText();
parent.setText5(ttiempoapertura.getText());
TIEMPOAPERTURA = ttiempoapertura.getText();
setVisible(false);
}
}
class VentanaDialogECH extends Frame implements ActionListener{
TextArea textArea;
public VentanaDialogECH(){
textArea=new TextArea(5,40);
textArea.setEditable(false);
add(”Center”,textArea);
String stock, maxcompra, limitereponer, cantidadreponer, tiempoapertura;
stock = ””; maxcompra = ””; limitereponer = ””;
cantidadreponer = ””; tiempoapertura = ””;
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
setVisible(false);
}});
try {
RandomAccessFile f1 = new RandomAccessFile (”Hilos.txt”, ”rw”);
long longitud;
longitud = 0;
f1.seek(longitud);
stock = f1.readUTF();
maxcompra = f1.readUTF();
limitereponer = f1.readUTF();
cantidadreponer = f1.readUTF();
tiempoapertura = f1.readUTF();
f1.close();
}
catch (Exception e) {
System.out.println(”Archivo Hilos: Salida luego de leer parámetros para actualizar datos: ” + e);
}
try {
Almacen a = new Almacen();
Productor p1 = new Productor(a,1);
Productor p2 = new Productor(a,2);
Consumidor c1 = new Consumidor(a,1);
Consumidor c2 = new Consumidor(a,2);
Consumidor c3 = new Consumidor(a,3);
a.stock = Integer.parseInt(stock);
a.MAXCOMPRA = Integer.parseInt(maxcompra);
a.LIMITEREPONER = Integer.parseInt(limitereponer);
a.CANTIDADREPONER = Integer.parseInt(cantidadreponer);
a.TIEMPOAPERTURA = Integer.parseInt(tiempoapertura);
p1.start();
p2.start();
c1.start();
c2.start();
c3.start();
}
catch (java.lang.Exception ex) {
// Atrapa excepciones y las despliega.
ex.printStackTrace ();
}
try {
RandomAccessFile f1 = new RandomAccessFile (”Hilos.txt”, ”rw”);
long longitud;
String c, d, asterisc;
longitud = 0;
f1.seek(longitud);
asterisc = ”\n*************************************”;
d = ”\n ”;
textArea.setFont(new Font(”Times”, 1, 11));
textArea.setForeground(Color.red);
textArea.append(asterisc);
textArea.append(”\nInicio de la ejecución concurrente con hilos.”);
textArea.append(”\nLos datos de configuración son los siguientes: ”);
c = f1.readUTF();
textArea.append(”\nNúmero inicial de bu¤ers ocupados: ” + c + ”.”);
c = f1.readUTF();
textArea.append(”\nNúmero máximo de bu¤ers leidos por vez: ” + c + ”.”);
c = f1.readUTF();
textArea.append(”\nNúmero mínimo de bu¤ers ocupados antes de grabar más: ” + c + ”.”);
c = f1.readUTF();
textArea.append(”\nNúmero de bu¤ers grabados por vez: ” + c + ”.”);
c = f1.readUTF();
textArea.append(”\nNúmero de milisegundos de la ejecución: ” + c + ”.”);
textArea.append(asterisc);
textArea.append(d);
f1.close();
}
catch (Exception e) {
System.out.println(”Archivo Hilos: Salida luego de leer parámetros para desplegarlos: ” + e);
}
}
public void actionPerformed(ActionEvent evt){
String str=evt.getActionCommand();
}
}
class VentanaDialogLCH extends Frame implements ActionListener{
TextArea textArea;
public VentanaDialogLCH(){
textArea=new TextArea(5,40);
textArea.setEditable(false);
add(”Center”,textArea);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
setVisible(false);
}});
try {
RandomAccessFile f1 = new RandomAccessFile (”Hilos.txt”, ”rw”);
long longitud;
String c, d, asterisc;
longitud = 0;
f1.seek(longitud);
asterisc = ”\n*************************************”;
d = ”\n ”;
textArea.setFont(new Font(”Times”, 1, 11));
textArea.setForeground(Color.red);
textArea.append(asterisc);
textArea.append(”\nInicio de la ejecución concurrente con hilos.”);
textArea.append(”\nLos datos de configuración son los siguientes: ”);
c = f1.readUTF();
textArea.append(”\nNúmero inicial de buffers ocupados: ” + c + ”.”);
c = f1.readUTF();
textArea.append(”\nNúmero máximo de buffers leidos por vez: ” + c + ”.”);
c = f1.readUTF();
textArea.append(”\nNúmero mínimo de buffers ocupados antes de grabar más: ” + c + ”.”);
c = f1.readUTF();
textArea.append(”\nNúmero de buffers grabados por vez: ” + c + ”.”);
c = f1.readUTF();
textArea.append(”\nNúmero de milisegundos de la ejecución: ” + c + ”.”);
textArea.append(asterisc);
textArea.append(d);
while ((c = f1.readUTF()) != null) {
textArea.append(c);
textArea.append(d);
}
f1.close();
}
catch (Exception e) {
System.out.println(”Archivo Hilos: Salida luego de leer parámetros para desplegarlos: ” + e);
}
}
public void actionPerformed(ActionEvent evt){
String str=evt.getActionCommand();
}
}
class VentanaDialogA extends Frame implements ActionListener{
TextArea textArea;
public VentanaDialogA(){
textArea=new TextArea(5,40);
textArea.setEditable(false);
add(”Center”,textArea);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
setVisible(false);
}});
try {
String asterisc = ”\n *************************************************”;
textArea.setFont(new Font(”Times”, 1, 11));
textArea.setForeground(Color.blue);
textArea.append(”\n ”);
textArea.append(asterisc);
textArea.append(”\n ”);
textArea.append(”\n Ayuda para la ejecución concurrente e hilos con JAVA.”);
textArea.append(”\n ******************************************************”);
textArea.append(”\n ”);
textArea.append(”\n El ejemplo contempla el problema de productores / consumidores:”);
textArea.append(”\n * Los hilos productores graban (y ocupan) buffers en un pool”);
textArea.append(”\n de buffers disponibles.”);
textArea.append(”\n * Los hilos consumidores leen (y liberan) buffers del pool”);
textArea.append(”\n de buffers disponibles.”);
textArea.append(”\n ”);
textArea.append(”\n Las opciones previstas contemplan lo siguiente:”);
textArea.append(”\n * Carga de datos de configuración de la ejecución.”);
textArea.append(”\n * Ejecución propiamente dicha.”);
textArea.append(”\n * Listado de los resultados por pantalla.”);
textArea.append(”\n ”);
textArea.append(”\n Los datos se cargan interactivamente por pantalla, ”);
textArea.append(”\n donde se sugieren valores de referencia.”);
textArea.append(”\n ”);
textArea.append(”\n Los resultados se graban en el archivo Hilos.txt,”);
textArea.append(”\n como registros de longitud variable.”);
textArea.append(”\n ”);
textArea.append(”\n ”);
textArea.append(asterisc);
textArea.append(”\n ”);
}
catch (java.lang.Exception ex) {
// Atrapa otro tipo de excepciones y las despliega.
ex.printStackTrace ();
}
}
public void actionPerformed(ActionEvent evt){
String str=evt.getActionCommand();
}
}
class VentanaDialogAS extends Frame implements ActionListener{
TextArea textArea;
public VentanaDialogAS(){
textArea=new TextArea(5,40);
textArea.setEditable(false);
add(”Center”,textArea);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
setVisible(false);
}});
try {
String asterisc = ”\n *************************************************”;
textArea.setFont(new Font(”Times”, 1, 11));
textArea.setForeground(Color.black);
textArea.append(”\n ”);
textArea.append(asterisc);
textArea.append(”\n ”);
textArea.append(”\n Acerca del sistema de concurrencia e hilos con JAVA.”);
textArea.append(”\n ****************************************************”);
textArea.append(”\n ”);
textArea.append(”\n Trabajo práctico de Sistemas Operativos.”);
textArea.append(”\n Licenciatura en Sistemas.”);
textArea.append(”\n Universidad Nacional del Nordeste (Argentina).”);
textArea.append(”\n ”);
textArea.append(”\n ”);
textArea.append(asterisc);
textArea.append(”\n ”);
}
catch (java.lang.Exception ex) {
// Atrapa otro tipo de excepciones y las despliega.
ex.printStackTrace ();
}
}
public void actionPerformed(ActionEvent evt){
String str=evt.getActionCommand();
}
}
class VImaCanvas extends Frame
implements AdjustmentListener {
Image imagen1;
ImaCanvas imaani;
Panel panel;
public VImaCanvas(){
setLayout(new BorderLayout());
panel = new Panel();
// Agregado de la imagen animada.
imagen1 = Toolkit.getDefaultToolkit().getImage(”Ani0076.gif”);
imaani = new ImaCanvas(imagen1);
panel.add(imaani);
add(”Center”,imaani);
}
public void adjustmentValueChanged(AdjustmentEvent evt){
imaani.repaint();
}
}
class ImaCanvas extends Canvas{
Image img;
int x,y;
public ImaCanvas(Image imagen1){
img=imagen1;
x=0;
y=0;
}
public void paint(Graphics g){
g.drawImage(img,0,0,this);
}
}
class Productor extends Thread {
private Almacen almacen;
private int numero;
public Productor(Almacen a, int numero) {
almacen = a;
this.numero = numero;
}
public void run() {
while(!almacen.cerrado){
if(System.currentTimeMillis()
-almacen.hora>almacen.TIEMPOAPERTURA){
almacen.cerrado=true;
try {
RandomAccessFile f1 = new RandomAccessFile (”Hilos.txt”, ”rw”);
long longitud;
String c;
c = ”Fin de la ejecución.”;
longitud = f1.length();
f1.seek(longitud);
f1.writeUTF(c);
f1.close();
}
catch (Exception e) {
System.out.println(”Archivo Hilos: Salida luego de grabar Fin de la ejecución: ” + e);
}
}
almacen.reponer(numero);
try {
sleep((int)(Math.random() * 100));
}
catch (InterruptedException e) {
}
}
}
}
class Consumidor extends Thread {
private Almacen almacen;
private int numero;
public Consumidor(Almacen a, int numero) {
almacen = a;
this.numero = numero;
}
public void run() {
int value;
while(!almacen.cerrado){
value=(int)(Math.random()*almacen.MAXCOMPRA);
almacen.comprar(numero,value);
}
}
}
class Almacen {
public int stock=0;
private boolean necesitareponer;
public boolean cerrado=false;
public int MAXCOMPRA=0;
public int LIMITEREPONER=0;
public int CANTIDADREPONER=0;
public long TIEMPOAPERTURA=0;
long hora=System.currentTimeMillis();
public synchronized void comprar(int consumidor,
int cantidad) {
while (necesitareponer == true) {
try { wait();
} catch (InterruptedException e) {
}
}
if(!cerrado){
if(stock<cantidad){
cantidad=stock;
}
stock-=cantidad;
try {
RandomAccessFile f1 = new RandomAccessFile (”Hilos.txt”, ”rw”);
long longitud;
String c;
c = ”Quedan ” + stock + ” unidades. El Consumidor ” + consumidor + ” ha leido ” +cantidad+” unidades.”;
longitud = f1.length();
f1.seek(longitud);
f1.writeUTF(c);
f1.close();
}
catch (Exception e) {
System.out.println(”Archivo Hilos: Salida luego de grabar Hilo Consumidor: ” + e);
}
if(stock<=LIMITEREPONER)
necesitareponer = true;
}
notify();
}
public synchronized void reponer(int productor) {
if (!cerrado){
while (necesitareponer == false) {
try { wait();
} catch (InterruptedException e) {}
}
stock+=CANTIDADREPONER;
try {
RandomAccessFile f1 = new RandomAccessFile (”Hilos.txt”, ”rw”);
long longitud;
String c;
c = ”Quedan ” + stock + ” unidades. El Productor ” + productor + ” ha grabado ” + CANTIDADREPONER + ” unidades.”;
longitud = f1.length();
f1.seek(longitud);
f1.writeUTF(c);
f1.close();
}
catch (Exception e) {
System.out.println(”Archivo Hilos: Salida luego de grabar Hilo Productor: ” + e);
}
necesitareponer = false;
}
notify();
}
}

Inicio:   Fin:

Datos y Ejecuciones

Los resultados detallados de las ejecuciones se muestran paso a paso en pantalla y son grabados en el archivo de datos y ejecuciones, que en este caso ha sido el archivo Hilos.txt, que es un archivo con registros de longitud variable, cuyos datos formateados, para una ejecución tomada como referencia, se encuentran en el archivo Hilos.dat.

El archivo generado (Hilos.txt), posee la siguiente estructura:

El contenido del mencionado archivo Hilos.dat luego de una de las ejecuciones de evaluación es el siguiente:

0
30
40
50
2000
Quedan 0 unidades. El Consumidor 1 ha leido 0 unidades.
Quedan 50 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 49 unidades. El Consumidor 2 ha leido 1 unidades.
Quedan 31 unidades. El Consumidor 2 ha leido 18 unidades.
Quedan 81 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 53 unidades. El Consumidor 1 ha leido 28 unidades.
Quedan 42 unidades. El Consumidor 1 ha leido 11 unidades.
Quedan 39 unidades. El Consumidor 1 ha leido 3 unidades.
Quedan 89 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 85 unidades. El Consumidor 2 ha leido 4 unidades.
Quedan 66 unidades. El Consumidor 2 ha leido 19 unidades.
Quedan 66 unidades. El Consumidor 2 ha leido 0 unidades.
Quedan 61 unidades. El Consumidor 2 ha leido 5 unidades.
Quedan 33 unidades. El Consumidor 2 ha leido 28 unidades.
Quedan 83 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 58 unidades. El Consumidor 3 ha leido 25 unidades.
Quedan 46 unidades. El Consumidor 3 ha leido 12 unidades.
Quedan 22 unidades. El Consumidor 3 ha leido 24 unidades.
Quedan 72 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 50 unidades. El Consumidor 1 ha leido 22 unidades.
Quedan 35 unidades. El Consumidor 2 ha leido 15 unidades.
Quedan 85 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 77 unidades. El Consumidor 3 ha leido 8 unidades.
Quedan 71 unidades. El Consumidor 1 ha leido 6 unidades.
Quedan 54 unidades. El Consumidor 1 ha leido 17 unidades.
Quedan 40 unidades. El Consumidor 1 ha leido 14 unidades.
Quedan 90 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 74 unidades. El Consumidor 3 ha leido 16 unidades.
Quedan 64 unidades. El Consumidor 3 ha leido 10 unidades.
Quedan 53 unidades. El Consumidor 1 ha leido 11 unidades.
Quedan 43 unidades. El Consumidor 1 ha leido 10 unidades.
Quedan 23 unidades. El Consumidor 1 ha leido 20 unidades.
Quedan 73 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 64 unidades. El Consumidor 2 ha leido 9 unidades.
Quedan 62 unidades. El Consumidor 2 ha leido 2 unidades.
Quedan 45 unidades. El Consumidor 2 ha leido 17 unidades.
Quedan 24 unidades. El Consumidor 2 ha leido 21 unidades.
Quedan 74 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 70 unidades. El Consumidor 1 ha leido 4 unidades.
Quedan 68 unidades. El Consumidor 1 ha leido 2 unidades.
Quedan 61 unidades. El Consumidor 1 ha leido 7 unidades.
Quedan 34 unidades. El Consumidor 1 ha leido 27 unidades.
Quedan 84 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 60 unidades. El Consumidor 2 ha leido 24 unidades.
Quedan 41 unidades. El Consumidor 3 ha leido 19 unidades.
Quedan 35 unidades. El Consumidor 3 ha leido 6 unidades.
Quedan 85 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 85 unidades. El Consumidor 1 ha leido 0 unidades.
Quedan 81 unidades. El Consumidor 1 ha leido 4 unidades.
Quedan 62 unidades. El Consumidor 1 ha leido 19 unidades.
Quedan 62 unidades. El Consumidor 2 ha leido 0 unidades.
Quedan 48 unidades. El Consumidor 2 ha leido 14 unidades.
Quedan 47 unidades. El Consumidor 2 ha leido 1 unidades.
Quedan 29 unidades. El Consumidor 2 ha leido 18 unidades.
Quedan 79 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 52 unidades. El Consumidor 3 ha leido 27 unidades.
Quedan 39 unidades. El Consumidor 3 ha leido 13 unidades.
Quedan 89 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 69 unidades. El Consumidor 2 ha leido 20 unidades.
Quedan 62 unidades. El Consumidor 2 ha leido 7 unidades.
Quedan 49 unidades. El Consumidor 2 ha leido 13 unidades.
Quedan 33 unidades. El Consumidor 1 ha leido 16 unidades.
Quedan 83 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 60 unidades. El Consumidor 3 ha leido 23 unidades.
Quedan 56 unidades. El Consumidor 3 ha leido 4 unidades.
Quedan 43 unidades. El Consumidor 2 ha leido 13 unidades.
Quedan 43 unidades. El Consumidor 2 ha leido 0 unidades.
Quedan 42 unidades. El Consumidor 2 ha leido 1 unidades.
Quedan 21 unidades. El Consumidor 2 ha leido 21 unidades.
Quedan 71 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 62 unidades. El Consumidor 1 ha leido 9 unidades.
Quedan 57 unidades. El Consumidor 1 ha leido 5 unidades.
Quedan 52 unidades. El Consumidor 1 ha leido 5 unidades.
Quedan 39 unidades. El Consumidor 1 ha leido 13 unidades.
Quedan 89 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 66 unidades. El Consumidor 3 ha leido 23 unidades.
Quedan 38 unidades. El Consumidor 3 ha leido 28 unidades.
Quedan 88 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 69 unidades. El Consumidor 2 ha leido 19 unidades.
Quedan 60 unidades. El Consumidor 2 ha leido 9 unidades.
Quedan 60 unidades. El Consumidor 3 ha leido 0 unidades.
Quedan 55 unidades. El Consumidor 3 ha leido 5 unidades.
Quedan 45 unidades. El Consumidor 3 ha leido 10 unidades.
Quedan 20 unidades. El Consumidor 3 ha leido 25 unidades.
Quedan 70 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 65 unidades. El Consumidor 1 ha leido 5 unidades.
Quedan 59 unidades. El Consumidor 1 ha leido 6 unidades.
Quedan 56 unidades. El Consumidor 1 ha leido 3 unidades.
Quedan 45 unidades. El Consumidor 1 ha leido 11 unidades.
Quedan 39 unidades. El Consumidor 1 ha leido 6 unidades.
Quedan 89 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 86 unidades. El Consumidor 3 ha leido 3 unidades.
Quedan 73 unidades. El Consumidor 3 ha leido 13 unidades.
Quedan 65 unidades. El Consumidor 3 ha leido 8 unidades.
Quedan 52 unidades. El Consumidor 3 ha leido 13 unidades.
Quedan 24 unidades. El Consumidor 3 ha leido 28 unidades.
Quedan 74 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 46 unidades. El Consumidor 1 ha leido 28 unidades.
Quedan 29 unidades. El Consumidor 1 ha leido 17 unidades.
Quedan 79 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 58 unidades. El Consumidor 2 ha leido 21 unidades.
Quedan 57 unidades. El Consumidor 2 ha leido 1 unidades.
Quedan 33 unidades. El Consumidor 2 ha leido 24 unidades.
Quedan 83 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 73 unidades. El Consumidor 3 ha leido 10 unidades.
Quedan 61 unidades. El Consumidor 1 ha leido 12 unidades.
Quedan 32 unidades. El Consumidor 1 ha leido 29 unidades.
Quedan 82 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 80 unidades. El Consumidor 2 ha leido 2 unidades.
Quedan 72 unidades. El Consumidor 3 ha leido 8 unidades.
Quedan 54 unidades. El Consumidor 3 ha leido 18 unidades.
Quedan 30 unidades. El Consumidor 3 ha leido 24 unidades.
Quedan 80 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 77 unidades. El Consumidor 1 ha leido 3 unidades.
Quedan 70 unidades. El Consumidor 1 ha leido 7 unidades.
Quedan 48 unidades. El Consumidor 1 ha leido 22 unidades.
Quedan 27 unidades. El Consumidor 1 ha leido 21 unidades.
Quedan 77 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 73 unidades. El Consumidor 2 ha leido 4 unidades.
Quedan 49 unidades. El Consumidor 2 ha leido 24 unidades.
Quedan 47 unidades. El Consumidor 2 ha leido 2 unidades.
Quedan 34 unidades. El Consumidor 1 ha leido 13 unidades.
Quedan 84 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 80 unidades. El Consumidor 3 ha leido 4 unidades.
Quedan 63 unidades. El Consumidor 3 ha leido 17 unidades.
Quedan 43 unidades. El Consumidor 3 ha leido 20 unidades.
Quedan 22 unidades. El Consumidor 2 ha leido 21 unidades.
Quedan 72 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 55 unidades. El Consumidor 2 ha leido 17 unidades.
Quedan 33 unidades. El Consumidor 2 ha leido 22 unidades.
Quedan 83 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 63 unidades. El Consumidor 1 ha leido 20 unidades.
Quedan 51 unidades. El Consumidor 1 ha leido 12 unidades.
Quedan 45 unidades. El Consumidor 1 ha leido 6 unidades.
Quedan 26 unidades. El Consumidor 1 ha leido 19 unidades.
Quedan 76 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 59 unidades. El Consumidor 2 ha leido 17 unidades.
Quedan 44 unidades. El Consumidor 2 ha leido 15 unidades.
Quedan 40 unidades. El Consumidor 1 ha leido 4 unidades.
Quedan 90 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 79 unidades. El Consumidor 3 ha leido 11 unidades.
Quedan 70 unidades. El Consumidor 3 ha leido 9 unidades.
Quedan 48 unidades. El Consumidor 3 ha leido 22 unidades.
Quedan 43 unidades. El Consumidor 3 ha leido 5 unidades.
Quedan 16 unidades. El Consumidor 3 ha leido 27 unidades.
Quedan 66 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 60 unidades. El Consumidor 2 ha leido 6 unidades.
Quedan 42 unidades. El Consumidor 2 ha leido 18 unidades.
Quedan 23 unidades. El Consumidor 2 ha leido 19 unidades.
Quedan 73 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 45 unidades. El Consumidor 3 ha leido 28 unidades.
Quedan 38 unidades. El Consumidor 3 ha leido 7 unidades.
Quedan 88 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 71 unidades. El Consumidor 2 ha leido 17 unidades.
Quedan 71 unidades. El Consumidor 2 ha leido 0 unidades.
Quedan 47 unidades. El Consumidor 2 ha leido 24 unidades.
Quedan 24 unidades. El Consumidor 3 ha leido 23 unidades.
Quedan 74 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 69 unidades. El Consumidor 3 ha leido 5 unidades.
Quedan 42 unidades. El Consumidor 3 ha leido 27 unidades.
Quedan 13 unidades. El Consumidor 3 ha leido 29 unidades.
Quedan 63 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 58 unidades. El Consumidor 2 ha leido 5 unidades.
Quedan 46 unidades. El Consumidor 2 ha leido 12 unidades.
Quedan 46 unidades. El Consumidor 1 ha leido 0 unidades.
Quedan 21 unidades. El Consumidor 1 ha leido 25 unidades.
Quedan 71 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 64 unidades. El Consumidor 3 ha leido 7 unidades.
Quedan 40 unidades. El Consumidor 2 ha leido 24 unidades.
Quedan 90 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 89 unidades. El Consumidor 1 ha leido 1 unidades.
Quedan 68 unidades. El Consumidor 1 ha leido 21 unidades.
Quedan 45 unidades. El Consumidor 1 ha leido 23 unidades.
Quedan 18 unidades. El Consumidor 3 ha leido 27 unidades.
Quedan 68 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 65 unidades. El Consumidor 2 ha leido 3 unidades.
Quedan 49 unidades. El Consumidor 2 ha leido 16 unidades.
Quedan 24 unidades. El Consumidor 2 ha leido 25 unidades.
Quedan 74 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 59 unidades. El Consumidor 3 ha leido 15 unidades.
Quedan 44 unidades. El Consumidor 3 ha leido 15 unidades.
Quedan 32 unidades. El Consumidor 3 ha leido 12 unidades.
Quedan 82 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 77 unidades. El Consumidor 1 ha leido 5 unidades.
Quedan 62 unidades. El Consumidor 1 ha leido 15 unidades.
Quedan 44 unidades. El Consumidor 1 ha leido 18 unidades.
Quedan 37 unidades. El Consumidor 1 ha leido 7 unidades.
Quedan 87 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 64 unidades. El Consumidor 3 ha leido 23 unidades.
Quedan 47 unidades. El Consumidor 3 ha leido 17 unidades.
Quedan 44 unidades. El Consumidor 2 ha leido 3 unidades.
Quedan 43 unidades. El Consumidor 2 ha leido 1 unidades.
Quedan 18 unidades. El Consumidor 2 ha leido 25 unidades.
Quedan 68 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 41 unidades. El Consumidor 1 ha leido 27 unidades.
Quedan 24 unidades. El Consumidor 1 ha leido 17 unidades.
Quedan 74 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 51 unidades. El Consumidor 3 ha leido 23 unidades.
Quedan 42 unidades. El Consumidor 1 ha leido 9 unidades.
Quedan 16 unidades. El Consumidor 1 ha leido 26 unidades.
Quedan 66 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 50 unidades. El Consumidor 2 ha leido 16 unidades.
Quedan 28 unidades. El Consumidor 2 ha leido 22 unidades.
Quedan 78 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 74 unidades. El Consumidor 1 ha leido 4 unidades.
Quedan 50 unidades. El Consumidor 3 ha leido 24 unidades.
Quedan 35 unidades. El Consumidor 3 ha leido 15 unidades.
Quedan 85 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 74 unidades. El Consumidor 2 ha leido 11 unidades.
Quedan 59 unidades. El Consumidor 2 ha leido 15 unidades.
Quedan 59 unidades. El Consumidor 1 ha leido 0 unidades.
Quedan 30 unidades. El Consumidor 1 ha leido 29 unidades.
Quedan 80 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 53 unidades. El Consumidor 3 ha leido 27 unidades.
Quedan 43 unidades. El Consumidor 3 ha leido 10 unidades.
Quedan 19 unidades. El Consumidor 3 ha leido 24 unidades.
Quedan 69 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 69 unidades. El Consumidor 1 ha leido 0 unidades.
Quedan 45 unidades. El Consumidor 1 ha leido 24 unidades.
Quedan 32 unidades. El Consumidor 1 ha leido 13 unidades.
Quedan 82 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 78 unidades. El Consumidor 2 ha leido 4 unidades.
Quedan 52 unidades. El Consumidor 2 ha leido 26 unidades.
Quedan 32 unidades. El Consumidor 2 ha leido 20 unidades.
Quedan 82 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 74 unidades. El Consumidor 1 ha leido 8 unidades.
Quedan 74 unidades. El Consumidor 1 ha leido 0 unidades.
Quedan 65 unidades. El Consumidor 1 ha leido 9 unidades.
Quedan 56 unidades. El Consumidor 1 ha leido 9 unidades.
Quedan 52 unidades. El Consumidor 3 ha leido 4 unidades.
Quedan 44 unidades. El Consumidor 3 ha leido 8 unidades.
Quedan 18 unidades. El Consumidor 2 ha leido 26 unidades.
Quedan 68 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 48 unidades. El Consumidor 2 ha leido 20 unidades.
Quedan 42 unidades. El Consumidor 2 ha leido 6 unidades.
Quedan 27 unidades. El Consumidor 1 ha leido 15 unidades.
Quedan 77 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 77 unidades. El Consumidor 1 ha leido 0 unidades.
Quedan 62 unidades. El Consumidor 1 ha leido 15 unidades.
Quedan 59 unidades. El Consumidor 1 ha leido 3 unidades.
Quedan 55 unidades. El Consumidor 1 ha leido 4 unidades.
Quedan 31 unidades. El Consumidor 1 ha leido 24 unidades.
Quedan 81 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 71 unidades. El Consumidor 3 ha leido 10 unidades.
Quedan 49 unidades. El Consumidor 3 ha leido 22 unidades.
Quedan 24 unidades. El Consumidor 3 ha leido 25 unidades.
Quedan 74 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 46 unidades. El Consumidor 3 ha leido 28 unidades.
Quedan 22 unidades. El Consumidor 3 ha leido 24 unidades.
Quedan 72 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 43 unidades. El Consumidor 2 ha leido 29 unidades.
Quedan 27 unidades. El Consumidor 2 ha leido 16 unidades.
Quedan 77 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 68 unidades. El Consumidor 3 ha leido 9 unidades.
Quedan 43 unidades. El Consumidor 3 ha leido 25 unidades.
Quedan 25 unidades. El Consumidor 3 ha leido 18 unidades.
Quedan 75 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 73 unidades. El Consumidor 2 ha leido 2 unidades.
Quedan 61 unidades. El Consumidor 2 ha leido 12 unidades.
Quedan 39 unidades. El Consumidor 2 ha leido 22 unidades.
Quedan 89 unidades. El Productor 2 ha grabado 50 unidades.
Quedan 85 unidades. El Consumidor 3 ha leido 4 unidades.
Quedan 68 unidades. El Consumidor 3 ha leido 17 unidades.
Quedan 57 unidades. El Consumidor 1 ha leido 11 unidades.
Quedan 41 unidades. El Consumidor 1 ha leido 16 unidades.
Quedan 25 unidades. El Consumidor 1 ha leido 16 unidades.
Quedan 75 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 67 unidades. El Consumidor 2 ha leido 8 unidades.
Quedan 67 unidades. El Consumidor 3 ha leido 0 unidades.
Quedan 65 unidades. El Consumidor 3 ha leido 2 unidades.
Quedan 46 unidades. El Consumidor 3 ha leido 19 unidades.
Quedan 36 unidades. El Consumidor 3 ha leido 10 unidades.
Quedan 86 unidades. El Productor 1 ha grabado 50 unidades.
Quedan 82 unidades. El Consumidor 2 ha leido 4 unidades.
Quedan 64 unidades. El Consumidor 2 ha leido 18 unidades.
Quedan 48 unidades. El Consumidor 2 ha leido 16 unidades.
Quedan 46 unidades. El Consumidor 2 ha leido 2 unidades.
Quedan 42 unidades. El Consumidor 2 ha leido 4 unidades.
Quedan 19 unidades. El Consumidor 2 ha leido 23 unidades.
Fin de la ejecución.

Inicio:   Fin:

Resultados y Conclusiones

La utilización de Java para la resolución del problema planteado ha resultado muy satisfactoria, destacándose las facilidades y potencia del producto, en especial para el manejo de hilos de ejecución y de la sincronización de los mismos.

Los resultados obtenidos ratifican, como era de esperarse, las previsiones teóricas en cuanto a las facilidades de los hilos o procesos ligeros para resolver problemas de concurrencia y de simultaneidad, en caso de disponer de multiprocesadores; esto los hace especialmente aplicables a un gran número de problemas propios de los sistemas operativos como administradores de recursos compartidos, siendo el caso del problema planteado, es decir el caso de procesos productores y procesos consumidores solo un caso genérico de la problemática antes mencionada.

Inicio:   Fin:
 
 

Para mayor información, seleccione una opción:

Número de visitas efectuadas desde el 17/12/2001: 
 
Estadísticas diarias desde el 10/07/2002:   Free counter and web stats  

Número de visitantes actuales disponible desde el 14/07/2002:

 

AddFreeStats.com Free Web Stats in real-time !  

 


 

Autor: lrmdavid@exa.unne.edu.ar

Ó FACENA - http://exa.unne.edu.ar

Servicios WEB: webmaster@exa.unne.edu.ar