Java - Pausar y reanudar hilos

   
Vista:

Pausar y reanudar hilos

Publicado por Stelio_Kontos (1 intervención) el 20/12/2015 02:56:00
Muy buenas a todos. A ver si alguien me puede ayudar...

Voy a intentar a ver si me puedo explicar...

Según tengo el código:
1- Genera un número random a encontrar por los jugadores
2- Pide número de jugadores (que serán el número de hilos)
3- Los jugadores generan números aleatorios para encontrar el random del punto 1
4- Hace el jugador 1 entero y pasa al jugador 2 y lo hace entero, pasa al jugador 3 y lo hace entero...

Lo que necesito es que el jugador 1 de un número y pase al jugador 2 diciendo otro número y el jugador 3 lo mismo y se vuelva a ir al jugador 1 para sacar otro número y así sucesivamente y cuando un jugador encuentre dicho número random se pare pero que los demás jugadores no paren hasta encontrar el número...

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
59
60
61
62
63
64
65
66
67
68
69
package hilos_java;
import java.lang.Math;
import java.util.ArrayList;
import java.util.Scanner;
 
 
public class hilos_1 extends Thread{
    static Scanner teclado = new Scanner(System.in);
    static int numeroJugadores;
    static int numeroRandomFinal = (int) (Math.random()*100);;
    int numeroRandomJugador;
    int intentos;
    int a;
    int re=0;
 
 
    public static void main(String[] args) throws InterruptedException {
 
           System.out.println("Número generado: " + numeroRandomFinal);
           System.out.print("Número de jugadores: ");
           numeroJugadores = teclado.nextInt();
           System.out.print("\n");
           hilos_1 hilos = new hilos_1();
            Thread[] Hil = new Thread[numeroJugadores];
               for (int i = 0; i < Hil.length; i++){
                   System.out.println("***** Jugador-"+(i+1)+" *****");
                   Hil[i] = new Thread(hilos);
                   Hil[i].start();
                   Hil[i].join();
               }
 
        }//main 
 
 
 
    public void run() {
        ArrayList<Integer> numeroRepeticion = new ArrayList<Integer>();
 
            try {
                    for (a=0; a!=numeroRandomFinal;){
                        a =  (int) (Math.random()*100);
 
                        while (numeroRepeticion.contains(a)){
                            a =  (int) (Math.random()*100);
                        }
                    numeroRepeticion.add(a);
 
                            intentos++;
 
                        System.out.println("Intentos: " + intentos + " Numero:" + a);
 
                        sleep(10);
 
 
                    }//for                     
 
                    if(a == numeroRandomFinal){
                        System.out.println("\nEl jugador " + currentThread().getName() + " ha acertado el número.");
                        System.out.println("Numero de intentos: " + intentos + "\n");
                        intentos = 0;
                            //sleep(1000);                     
                    }
 
                } catch (InterruptedException e) {
                   e.printStackTrace();
               }
       }//run                       
 
}//class  


---Lo que me hace---
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
Número generado: 7
Número de jugadores: 3
 
***** Jugador-1 *****
Intentos: 1 Numero:77
Intentos: 2 Numero:81
Intentos: 3 Numero:22
Intentos: 44 Numero:67
Intentos: 45 Numero:2
Intentos: 46 Numero:52
Intentos: 47 Numero:8
Intentos: 48 Numero:7
 
El jugador Thread-1 ha acertado el número.
Numero de intentos: 8
 
***** Jugador-2 *****
Intentos: 1 Numero:42
Intentos: 2 Numero:33
Intentos: 3 Numero:81
 
El jugador Thread-2 ha acertado el número.
Numero de intentos: 3
 
***** Jugador-3 *****
Intentos: 1 Numero:8
 
El jugador Thread-3 ha acertado el número.
Numero de intentos: 1

---Lo que necesito---
1
2
3
4
5
6
7
8
9
10
11
12
13
***** Jugador-1 *****
Intentos: 1 Numero:77
***** Jugador-2 *****
Intentos: 1 Numero:42
***** Jugador-3 *****
Intentos: 1 Numero:8
 
***** Jugador-1 *****
Intentos: 2 Numero:73
***** Jugador-2 *****
Intentos: 2 Numero:43
***** Jugador-3 *****
Intentos: 2 Numero:33
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

Pausar y reanudar hilos

Publicado por Marcelo (47 intervenciones) el 21/12/2015 16:25:30
Buenas, que tal?

Estuve mirando un poco la solución que subiste y encontré un par de detalles que se deben ajustar según lo que se necesite.

Lo primero es que el responsable de la salida actual que muestras es el .join al inicializar los thread (Este método lo que hace es decirle al Thread creador que espere hasta que el thread creado o hijo finalice) como tu lo llamas ni bien lanzas un thread pero antes de crear el resto, tu código ejecuta el thread, luego crea el siguiente y lo ejecuta y así sucesivamente.

Hay un par de temas adicionales que son las sincronizaciones de variables. estas accediendo a variables que son compartidas por los thread (porque son instancias de clase) por lo que dichas variables deben ser sincronizadas de alguna forma.

Acá te dejo una versión con varios de los arreglos que te comente, probala y me avisas si te sirve

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import java.lang.Math;
import java.util.ArrayList;
import java.util.Scanner;
 
 
public class hilos_1 extends Thread{
    volatile static Scanner teclado = new Scanner(System.in);
    volatile static int numeroJugadores;
    volatile static int numeroRandomFinal = (int) (Math.random()*100);;
    volatile static int numeroRandomJugador;
 
    int a;
    int re=0;
 
 
    public static void main(String[] args) throws InterruptedException {
 
           System.out.println("Número generado: " + numeroRandomFinal);
           System.out.print("Número de jugadores: ");
           numeroJugadores = teclado.nextInt();
           System.out.print("\n");
           hilos_1 hilos = new hilos_1();
            Thread[] Hil = new Thread[numeroJugadores];
               for (int i = 0; i < Hil.length; i++){
                   //System.out.println("***** Jugador-"+(i+1)+" *****");
                   Hil[i] = new Thread(hilos);
				   Hil[i].setName("***** Jugador-"+(i+1)+" *****");
                   Hil[i].start();
                   //Hil[i].join();
               }
 
			   for (int i = 0; i < Hil.length; i++){
                   Hil[i].join();
               }
 
        }//main 
 
 
 
    public void run() {
        ArrayList<Integer> numeroRepeticion = new ArrayList<Integer>();
			int intentos = 0;
            try {
                    for (a=0; a!=numeroRandomFinal;){
 
                        a =  (int) (Math.random()*100);
 
                        while (numeroRepeticion.contains(a)){
                            a =  (int) (Math.random()*100);
                        }
                    numeroRepeticion.add(a);
 
                            intentos++;
						String texto = Thread.currentThread().getName();
                        texto += "\nIntentos: " + intentos + " Numero:" + a;
						System.out.println(texto);
 
                        sleep(10);
 
 
                    }//for                     
 
                    if(a == numeroRandomFinal){
                        System.out.println("\nEl jugador " + currentThread().getName() + " ha acertado el número.");
                        System.out.println("Numero de intentos: " + intentos + "\n");
                        intentos = 0;
                            //sleep(1000);                     
                    }
 
                } catch (InterruptedException e) {
                   e.printStackTrace();
               }
       }//run                       
 
}//class  
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