Fecha y hora actual: Martes 20 Ago 2019 09:57
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

Ayuda con wait () y notify ()

Responder al Tema

Índice del Foro > Java > Ayuda con wait () y notify ()

Autor Mensaje
TaquionII



Registrado: 18 Nov 2013
Mensajes: 2

Mensaje Publicado: Lunes 18 Nov 2013 13:03

Título del mensaje: Ayuda con wait () y notify ()

Responder citando

Hola buenas,

estoy intentando aclararme con los métodos wait y notify. Para ello he hecho un pequeño programa pero no se ejecuta como yo quiero.
El programilla trata del típico ejercicio Productor/Consumidor donde dos hilos diferentes tienen que acceder a una lista.
Os pongo el programilla.


Código:
  1.  
  2.  
  3. class Almacen {
  4.  
  5. public List <Integer> miLista = new LinkedList<Integer> ();
  6.  
  7. public void escribir (int dato) {
  8.  
  9. synchronized (miLista){
  10.  
  11. miLista.add(dato);
  12. miLista.notify ();
  13. }
  14.  
  15.  
  16. System.out.println("Se ha añadido el dato " + dato + " a la lista");
  17. }
  18.  
  19. public void leer (){
  20.  
  21. synchronized (miLista){
  22.  
  23. if (miLista.size () == 0){
  24.  
  25. try {
  26. miLista.wait ();
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. }
  32. System.out.println("Datos de mi lista " + miLista.remove(0) );
  33. }
  34. }
  35.  
  36. class Productor extends Thread {
  37.  
  38. private int ndatos;
  39. private Almacen al = new Almacen ();
  40.  
  41. Productor (int ndatos) {this.ndatos = ndatos;}
  42.  
  43. public void run () {
  44.  
  45. Scanner es = new Scanner (System.in);
  46.  
  47. for (int k = 0 ; k < ndatos ; k++){
  48.  
  49. System.out.println ("Introduce el dato " + k + " en la lista");
  50. al.escribir ( es.nextInt () );
  51. }
  52. }
  53. }
  54.  
  55. class Consumidor extends Thread {
  56.  
  57. Almacen Al = new Almacen ();
  58.  
  59. public void run () {
  60.  
  61. Al.leer ();
  62. }
  63. }
  64.  
  65. public class Prueba {
  66.  
  67. public static void main ( String [] args ) {
  68.  
  69. Productor p = new Productor (5); // Voy a introducir 5 datos.
  70. Consumidor c = new Consumidor ();
  71.  
  72. p.start ();
  73. c.start ();
  74. System.out.println ("Empezando el programa");
  75. }
  76. }
  77.  


El problema lo tengo en que cuando el Consumidor accede al método leer () y se queda en espera de que el productor le envie el notify, el Consumidor no "escucha" el notify y se me queda el programa en espera indefinidamente.
Consejos para salir del problema ?
Muchas gracias.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
pacm
Usuario Iniciado


Registrado: 24 Ago 2013
Mensajes: 14

Mensaje Publicado: Miércoles 04 Dic 2013 18:26

Título del mensaje: Re: Ayuda con wait () y notify ()

Responder citando

Te explico tu error.

Cuando usas wait y notify, si te fijas le estas pasando un objeto "sobre el que escucharse mutuamente", tu estás creando dos objetos diferentes de la clase Almacen por lo tanto nunca jamás se escucharan porque no están pendiente de la misma cosa.


En resumen, el productor notifica en un objeto almacen diferente al que está escuchando el consumidor por eso jamás sale de ese paso.

Un saludo.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Responder al Tema
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Ayuda urgente con tarea de programa en lenguaje C

dominicanvictor C, C#, Visual C++ 0 Lunes 05 Ago 2019 18:04 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Hola, necesito ayuda para esto, algun programad...

Lino Romero Programación en general 0 Jueves 11 Jul 2019 06:52 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Por favor ayuda!!!!!!

Enzo89 Temas generales 1 Jueves 23 May 2019 01:08 Ver último mensaje
El foro no contiene ningún mensaje nuevo

AYUDA CON BUCLES ABIERTOS Y CERRADOS PARA VISUA...

Fabricio Esteban P Visual Basic y VBA 0 Miércoles 08 May 2019 05:21 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,