Buenas tengo un problema en un ejercicio de hilos donde hay un clase CestaManzanas y otra ComedorManzanas, el enunciado pide que entren 5 hilos y vayan comiendo manzanas de la cesta(la cesta tiene 750 manzanas) hasta que se terminen de 20 en 20 por cada vez que entra un hilo en la cesta, la cuestión es que me salta una excepción de java.lang.NullPointerException en la llamada al método comedor.manzana_comida();,además dentro del bucle for den bloque sincronizado sólo hace un iteración, no se porque no se completa... ¿alguna sugerencia? pego ambas clases.
package Hilos_Juanfran;
public class CestaManzanas{
private int cantidad_manzanas =750;
private int contador_comedores=0;
private ComedorManzanas comedor;
private int manzanas_comidas;
private int lleno=20;
public int getCantidad_manzanas() {
return cantidad_manzanas;
}
public void setCantidad_manzanas(int cantidad_manzanas) {
this.cantidad_manzanas = cantidad_manzanas;
}
public int getContador_comedores() {
return contador_comedores;
}
public void setContador_comedores(int contador_comedores) {
this.contador_comedores = contador_comedores;
}
public ComedorManzanas getComedor() {
return comedor;
}
public void setComedor(ComedorManzanas comedor) {
this.comedor = comedor;
}
public void entrar_cesta() {
contador_comedores++;
synchronized (this) {
//Como el enunciado permite un máximo de 5 si lo supera ponemos el/los comedor/es a la espera
if (contador_comedores>5)
try {
wait();
}catch(Exception e) {
e.printStackTrace();
System.out.println("Entró en el bloque de error1");
}
//en caso contrario entran consumidores
System.out.println(Thread.currentThread().getName() + " esta comiendo manzananas");
manzanas_comidas=0;
cantidad_manzanas--;
for(int i = 1; i < lleno; i++) {
if (manzanas_comidas<lleno) {
manzanas_comidas++;
comedor.manzana_comida();
}
}
contador_comedores--;
try {
notify();
}catch(Exception e) {
e.printStackTrace();
System.out.println("Entró en el bloque de error2");
}
}
}
//fin sincronizado
public CestaManzanas() {
super();
}
}//fin clase CestaManzanas
No sé porqué el método manzana_comida() no sabe a donde apunta, no encuentro el error.
package Hilos_Juanfran;
public class ComedorManzanas implements Runnable {
private int id;
private int manzanas_comidas;
private CestaManzanas cesta;
private int manzanaxhilo=0;
//constructores
public ComedorManzanas() {
super();
}
public int getManzanaxhilo() {
return manzanaxhilo;
}
public void setManzanaxhilo(int manzanaxhilo) {
this.manzanaxhilo = manzanaxhilo;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getManzanas_comidas() {
return manzanas_comidas;
}
public void setManzanas_comidas(int manzanas_comidas) {
this.manzanas_comidas = manzanas_comidas;
}
public ComedorManzanas(int id, int manzanas_comidas, CestaManzanas cesta) {
super();
this.id = id;
this.manzanas_comidas = manzanas_comidas;
this.cesta = cesta;
}
public ComedorManzanas(CestaManzanas cesta) {
super();
this.cesta = cesta;
}
public void manzana_comida() {
manzanaxhilo++;
}
@Override
public void run() {
cesta.entrar_cesta();
System.out.println(Thread.currentThread().getName()+" ha comido: "+ manzanaxhilo+ getManzanaxhilo());
}
}//fin clase ComedorManzanas