Como entretener a un hilo hasta que todos ejecuten su run()
Publicado por augustojimenez1 (2 intervenciones) el 07/03/2013 04:00:09
Buenas noches:
Estoy implementando el siguiente escenario.
4 niños (Threads) están jugando a colocar el nombre de su color favorito y el RGB correspondiente en una maquina de colores solo tiene espacio para un nombre de color y su RGB correspondiente.
Esta máquina solo permite que un niño a la vez entre a ella. La máquina toma el nombre del color favorito del niño, lo guarda, y seguidamente toma el RGB y lo guarda.
Cuando la maquina realiza estas dos operaciones, el niño sale de ella y se va a esperar a que otro niño entre. La máquina sobreescribirá los valores nombre de color y RGB cada vez que un niño llegue.
Cuando los 4 hayan pasado, se revisará la máquina y extraerán sus dos valores. Se compararán los valores de nombre de color y RGB de la máquina con los de los niños(que siguen esperando el resultado) y se eliminará al niño que contenga la combinacion del color y RGB que tiene la máquina, o sea el último.
Una vez eliminado el último, se informará a los niños que ya pueden volver a jugar y se repetirá el proceso hasta que solo queden 2 niños.
Al final se informará quién ganó.
-------------------------------------------------------------------
He intentado de todo, pero sé que no estoy haciendo lo correcto pues no logro detener a los niños una vez que han salido de la máquina.
<b>¿Cómo los detengo? ¿Cómo los entretengo?</b>
Aquí están mis clases:
MaquinaColores.java. Esta logra su cometido.
Nino.java
JuegoMaquinaColores.java
Pueden decirme ¿cómo detengo a cada Thread después de meterse a la maquina para que se esperan a que pasen los demás?. ¿Cómo arrancarlos después?.
Estoy implementando el siguiente escenario.
4 niños (Threads) están jugando a colocar el nombre de su color favorito y el RGB correspondiente en una maquina de colores solo tiene espacio para un nombre de color y su RGB correspondiente.
Esta máquina solo permite que un niño a la vez entre a ella. La máquina toma el nombre del color favorito del niño, lo guarda, y seguidamente toma el RGB y lo guarda.
Cuando la maquina realiza estas dos operaciones, el niño sale de ella y se va a esperar a que otro niño entre. La máquina sobreescribirá los valores nombre de color y RGB cada vez que un niño llegue.
Cuando los 4 hayan pasado, se revisará la máquina y extraerán sus dos valores. Se compararán los valores de nombre de color y RGB de la máquina con los de los niños(que siguen esperando el resultado) y se eliminará al niño que contenga la combinacion del color y RGB que tiene la máquina, o sea el último.
Una vez eliminado el último, se informará a los niños que ya pueden volver a jugar y se repetirá el proceso hasta que solo queden 2 niños.
Al final se informará quién ganó.
-------------------------------------------------------------------
He intentado de todo, pero sé que no estoy haciendo lo correcto pues no logro detener a los niños una vez que han salido de la máquina.
<b>¿Cómo los detengo? ¿Cómo los entretengo?</b>
Aquí están mis clases:
MaquinaColores.java. Esta logra su cometido.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class MaquinaColores {
private String color;
private int[] rgb;
boolean setRgbEstaOcupado = false;
public String getColor() {
return color;
}
public synchronized void setColor(Nino nino) {
while (setRgbEstaOcupado == true) {
try {
wait();
} catch (InterruptedException ie) {
System.out.println(nino.getName() + " fue interrumpido.");
}
}
this.color = nino.colorFavorito.getName();
System.out.print("Llegó el " + nino.getName() + ". Tengo el color " + this.getColor() + ". ");
}
public int[] getRgb() {
return rgb;
}
public synchronized void setRgb(Nino nino) {
this.setRgbEstaOcupado = true;
this.rgb = nino.colorFavorito.getRgb();
System.out.println("\tTengo el RGB " + this.getRgb()[0] + ", " + this.getRgb()[1] + ", " + this.getRgb()[2]);
this.setRgbEstaOcupado = false;
notifyAll();
}
}
Nino.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class Nino extends Thread {
ColorFavorito colorFavorito = new ColorFavorito();
MaquinaColores maquina = null;
int entradasAMaquina = 0;
// Constructor de Nino
Nino(MaquinaColores maquina, String nombreNino, String color, int[] rgb) {
super(nombreNino);
this.maquina = maquina;
this.colorFavorito.setName(color);
this.colorFavorito.setRgb(rgb);
System.out.println(this.getName() + " creado");
setDaemon(true);
}
public void run() {
try {
Thread.sleep((long) (Math.random() * 3000)); //retardo para que empiezen
} catch (InterruptedException e1) { //en tiempos distintos.
}
for (;;) {
maquina.setColor(this);
maquina.setRgb(this);
try {
wait(); //no se detiene
System.out.println("Sali del wait");
} catch (InterruptedException e) {
notifyAll(); //lanza IllegalMonitorStateException
}
}
}
public ColorFavorito getColorFavorito() {
return colorFavorito;
}
}
JuegoMaquinaColores.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class JuegoMaquinaColores {
public static void main(String[] args) {
new JuegoMaquinaColores();
} // fin del main()
@SuppressWarnings("deprecation")
public JuegoMaquinaColores() {
MaquinaColores maquina = new MaquinaColores();
int[] rgb1 = { 150, 150, 150, 150 };
int[] rgb2 = { 225, 225, 225, 225 };
int[] rgb3 = { 50, 50, 50, 50 };
int[] rgb4 = { 30, 30, 30, 30 };
System.out.println("Se crean los ninos");
Nino nino1 = new Nino(maquina, "nino1", "blue", rgb1);
Nino nino2 = new Nino(maquina, "nino2", "yellow", rgb2);
Nino nino3 = new Nino(maquina, "nino3", "rojo", rgb3);
Nino nino4 = new Nino(maquina, "nino4", "green", rgb4);
System.out.println("\nSe arrancan los ninos");
nino1.start();
nino2.start();
nino3.start();
nino4.start();
try {
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}
int ronda = 0;
while (ronda < 3) {
if (maquina.getColor().equals(nino1.colorFavorito.getName())){
nino1.stop(); //si lo saca del juego
System.out.println("En la ronda " + (ronda+1) + "Pierde Nino1 \n");
} else if (maquina.getColor().equals(nino2.colorFavorito.getName())){
nino2.stop();
System.out.println("En la ronda " + (ronda+1) + "Pierde Nino2 \n");
} else if (maquina.getColor().equals(nino3.colorFavorito.getName())){
nino3.stop();
System.out.println("En la ronda " + (ronda+1) + "Pierde Nino3 \n");
} else if (maquina.getColor().equals(nino4.colorFavorito.getName())){
nino4.stop();
System.out.println("En la ronda " + (ronda+1) + "Pierde Nino4 \n");
}
try {
Thread.sleep(4000); //retardo para que vuelvan a jugar
} catch (Exception e) {
e.printStackTrace();
}
ronda++;
}
}
}
Pueden decirme ¿cómo detengo a cada Thread después de meterse a la maquina para que se esperan a que pasen los demás?. ¿Cómo arrancarlos después?.
Valora esta pregunta


0