Java - Como entretener a un hilo hasta que todos ejecuten su run()

 
Vista:

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.
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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Como entretener a un hilo hasta que todos ejecuten su run()

Publicado por augustojimenez1 (2 intervenciones) el 10/03/2013 07:56:08
Lo he resuelto:

Cada objeto de la clase Nino, en su método run, debe sincronizar al objeto maquina antes de utilizar sus metodos, de la siguiente forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for (;;) {
        synchronized (maquina) { //Aquí el nino se apropia al objeto maquina
	maquina.setColor(this);
	maquina.setRgb(this);
	if (pasadas < 5) {  // si no han pasado los 4 ninos
			try {
				System.out.println(".  " + this.getName() + " espera");
				pasadas++;
				maquina.wait(); //el objeto se pone en espera de la maquina. Con esto la 
				pasadas = 1;     //maquina se libera para ser usada por otro nino
			} catch (InterruptedException e) {
				System.out.println(this.getName() + " fue interrumpido.");
			}
		} else {
 
		}
	}
}


Cuando un nino llega su método run, pide usar al objeto maquina (sus dos métodos para ser exactos) y en cuanto termina se compara si ya pasaron los cuatro ninos (con el atributo estático pasadas que incrementará cada vez que un nino use la maquina).

En este punto el objeto maquina aun está siendo utilizado por el mismo nino que la obtuvo. Si no han pasado los cuatro ninos, entonces el nino que actualmente ejecuta su metodo run() invoca al método maquina.wait() y se hace esperar por el recurso maquina.

En cuanto el nino, del que estamos hablando, invoca el metodo wait de la maquina, se pone en espera y libera este recurso para que otro nino pueda usarla. Se repite hasta que todos los ninos hayan pasado a la maquina.

Cuando los ninos terminan de pasar todos, ellos siguen en espera ( wait() ) por la maquina. Desde el método main, que es donde se controlan las rondas del juego, se compara el par de valores que quedaron en la maquina y revisa a qué nino corresponde dicha combinación. Se detiene el hilo resultante con esa combinacion y se llama al método maquina.notifyAll() que en cuanto se ejecuta, los ninos despiertan y vuelven a repetir el proceso de utilizar los dos métodos de la maquina y esperar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como entretener a un hilo hasta que todos ejecuten su run()

Publicado por juan fransico (1 intervención) el 18/08/2013 01:29:21
hola oye tengo un ejercicio similar la verdad no me a queda algo claro lo de los hilos no se si me puedas proporcionar tu codigo para poder analizarlo detalladamente el mio es de un juego se sillas pero creo que lo mas similar que he leido es el tuyo espero me puedas ayudar muchas gracias ya terminado mi codigo lo subo para compartirlo gracias y espero me puedas ayudar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar