Supongamos que tenemos un sistema compuesto por infinitas unidades de átomos de
hidrógeno y oxígeno, que lo único que quieren hacer es combinarse para formar moléculas de agua.
Para ello dispondremos de una clase denominada Aire, que recibirá peticiones de los átomos mediante un método denominado combinar (id), donde id nos dirá si lo que quiere combinarse es un átomo de oxígeno o de hidrógeno.
- Cuando un átomo quiere combinarse hay que comprobar si ya existen otros 2 átomos
complementarios. En ese caso, la molécula se forma.
- Si no están todavía sus otros 2 átomos complementarios, entonces debe bloquearse y
esperar a que lleguen los 2 que faltan o el que falta. Sólo cuando lleguen los que faltan
entonces pueden seguir los tres átomos.
- Los átomos que llegan pero no pueden formar molécula porque ya hay uno (en el caso
del oxígeno
Para resolver dicho problema, he desarrollado así la clase Aire:
MI PROBLEMA ES QUE SIEMPRE HAY ÁTOMOS SUFICIENTES PARA TODAS LAS MOLÉCULAS, PONGA LO QUE PONGA
(Sinceramente, soy novato en concurrente y...)
hidrógeno y oxígeno, que lo único que quieren hacer es combinarse para formar moléculas de agua.
Para ello dispondremos de una clase denominada Aire, que recibirá peticiones de los átomos mediante un método denominado combinar (id), donde id nos dirá si lo que quiere combinarse es un átomo de oxígeno o de hidrógeno.
- Cuando un átomo quiere combinarse hay que comprobar si ya existen otros 2 átomos
complementarios. En ese caso, la molécula se forma.
- Si no están todavía sus otros 2 átomos complementarios, entonces debe bloquearse y
esperar a que lleguen los 2 que faltan o el que falta. Sólo cuando lleguen los que faltan
entonces pueden seguir los tres átomos.
- Los átomos que llegan pero no pueden formar molécula porque ya hay uno (en el caso
del oxígeno
Para resolver dicho problema, he desarrollado así la clase Aire:
Código [Seleccionar]
public class Aire {
int atomosHidrogeno = 0;
int atomosOxigeno = 0;
int atomosH_esperando;
int atomosO_esperando;
public Aire(int atH, int atO2) {
this.atomosHidrogeno = atH;
this.atomosOxigeno = atO2;
this.atomosH_esperando = 0;
this.atomosO_esperando = 0;
}
public void combinar(int id) {
if (id == 0) // Hidrogeno
{
synchronized (this) {
while (this.atomosH_esperando == 2 || (this.atomosHidrogeno < 1 && this.atomosOxigeno < 0)) {
try {
wait();
this.atomosH_esperando++;
} catch (InterruptedException ie) {
}
}
notify();
}
this.atomosH_esperando--;
System.out.println("Molécula formada");
} else if (id == 1) // Oxigeno
{
synchronized (this) {
while (this.atomosH_esperando == 2 || (this.atomosHidrogeno < 2)) {
try {
wait();
this.atomosO_esperando++;
} catch (InterruptedException ie) {
}
}
notify();
}
this.atomosO_esperando--;
System.out.println("Molécula formada");
}
}
}
MI PROBLEMA ES QUE SIEMPRE HAY ÁTOMOS SUFICIENTES PARA TODAS LAS MOLÉCULAS, PONGA LO QUE PONGA
(Sinceramente, soy novato en concurrente y...)