Foros del Web » Programación para mayores de 30 ;) » Java »

Productor/Consumidor

Estas en el tema de Productor/Consumidor en el foro de Java en Foros del Web. Buenas, necesito implementar el problema concurrente de Productor/Consumidor mediante synchronized, wait() y notify(). Debe haber: Una clase productor. Una clase consumidor. Una claseQ, especificada más ...
  #1 (permalink)  
Antiguo 22/03/2011, 07:41
Avatar de Stoyicker  
Fecha de Ingreso: marzo-2011
Mensajes: 9
Antigüedad: 13 años, 1 mes
Puntos: 1
Productor/Consumidor

Buenas, necesito implementar el problema concurrente de Productor/Consumidor mediante synchronized, wait() y notify().

Debe haber:

Una clase productor.
Una clase consumidor.
Una claseQ, especificada más abajo, y que puede ser modificada de ser necesario (añadiendo syncrhonized, wait() o notify() de hacer falta).
Una clase Main que crea tres objetos, una claseQ, un productor y un consumidor.

claseQ:

public class claseQ {

int id = 0;

public int get() throws InterruptedException {
return id;
}

public void put(int e) {
id = e;
}
}

Acción de producir:

obj.put(i);
System.out.println("Objeto introducido: "+i);

Acción de consumir:

System.out.println("Objeto obtenido: " + obj.get());

Lo he intenado millones de veces pero las pocas que no me sale IlegalMonitorStatException no se sincronizan; el productor va tremendamente más rápido que el consumidor. ¿Puede alguien escribir las clases main, productor y consumidor (y claseQ, si hiciese falta editarla), para ver si con la solución lo veo más claro?
  #2 (permalink)  
Antiguo 22/03/2011, 07:59
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: Productor/Consumidor

¿Puedes publicar lo que ya tienes y así trabajamos sobre esa base?
  #3 (permalink)  
Antiguo 22/03/2011, 08:08
Avatar de Stoyicker  
Fecha de Ingreso: marzo-2011
Mensajes: 9
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Productor/Consumidor

Hombre, si crees que va a ser útil...

Main:

Código C:
Ver original
  1. public class Main extends Thread {
  2.  
  3.     /**
  4.      * @param args the command line arguments
  5.      */
  6.     public static void main(String[] args) {
  7.         claseQ cola = new claseQ();
  8.         Productor producer = new Productor(cola);
  9.         Consumidor consumer = new Consumidor(cola, producer);
  10.         producer.start();
  11.         consumer.start();
  12.     }
  13. }

claseQ:

Código C:
Ver original
  1. public class claseQ {
  2.  
  3.     int id = 0;
  4.  
  5.     public int get() throws InterruptedException {
  6.         return id;
  7.     }
  8.  
  9.     public void put(int e) {
  10.         id = e;
  11.     }

Productor:

Código C:
Ver original
  1. public class Productor extends Thread implements Runnable {
  2.  
  3.     claseQ obj;
  4.  
  5.     public Productor(claseQ obja) {
  6.         obj=obja;
  7.     }
  8.  
  9.     public void run(){
  10.     for (int i = 0; 1 < 2; i++) {
  11.             obj.put(i);
  12.             System.out.println("Objeto introducido: "+i);
  13.         }
  14.     }
  15. }

Consumidor:

Código C:
Ver original
  1. public class Consumidor extends Thread implements Runnable {
  2.  
  3.     claseQ obj;
  4.  
  5.     public Consumidor(claseQ obja, Productor p) {
  6.         obj = obja;
  7.     }
  8.  
  9.     public void run() {
  10.             for (int i = 0; 1 < 2; i++) {
  11.                 System.out.println("Objeto obtenido: " + obj.get());
  12.         }
  13.     }
  14. }

He quitado todas las movidas de waits, synchronizeds y notifys que había puesto porque ya las había probado y provocan siempre interbloqueo o excepción T.T
  #4 (permalink)  
Antiguo 22/03/2011, 10:25
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: Productor/Consumidor

¿Por qué le pasas el productor al constructor del consumidor y luego no lo utilizas?

Veo que en el main invocas a una función start, pero en las clases no existe ese método, existe un método run.

Luego, en la forma que lo tienes el consumidor no consume todos los objetos de la cola, simplemente coge el último que haya insertado el productor
  #5 (permalink)  
Antiguo 22/03/2011, 10:46
 
Fecha de Ingreso: enero-2008
Mensajes: 614
Antigüedad: 16 años, 4 meses
Puntos: 57
Respuesta: Productor/Consumidor

Cita:
Iniciado por Heimish2000 Ver Mensaje
Veo que en el main invocas a una función start, pero en las clases no existe ese método, existe un método run.
El metodo start() es de la clase Thread

Stoyicker, en las clases que vas a utilizar para crear hilos no es necesario que heredes de Thread y Runnable. Se utiliza una u otra.

Aunque es un ejercicio que deberias hacer tu, tutoriales sobre este tipo de tareas existen muchas en internet. Lee algunas para que te des una idea, NO LAS COPIES!

http://download.oracle.com/javase/tu...guardmeth.html
http://www.java2s.com/Tutorial/Java/...erandQueue.htm

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:08.