Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Ninja_Kyubi en 20 Diciembre 2015, 03:07 am



Título: Pausar y reanudar hilos
Publicado por: Ninja_Kyubi en 20 Diciembre 2015, 03:07 am
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...

Código:
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 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...

---Lo que me hace---
Código:
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: 48 Numero:7

El jugador Thread-1 ha acertado el número.
Numero de intentos: 5

***** 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---
Código:
***** 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 


Título: Re: Pausar y reanudar hilos
Publicado por: Atry en 20 Diciembre 2015, 14:44 pm
 :D Hola! Cuanto tiempo sin pasar por este foro ^^

A ver, igual te parece una tontería, pero si no te he entendido mal. Buscas que cuando un jugador encuentre el numero, este no pueda volver a introducir números, pero el resto sí.

¿Porque no usas una flag? Estableces un booleano llamado por ejemplo numEncontrado que por defecto en todos los jugadores sea "false" y cuando dé con el número lo estableces a true, así antes de solicitar introducir un numero pones un if(numEncontrado).


Título: Re: Pausar y reanudar hilos
Publicado por: Ninja_Kyubi en 20 Diciembre 2015, 16:43 pm
:D Hola! Cuanto tiempo sin pasar por este foro ^^

A ver, igual te parece una tontería, pero si no te he entendido mal. Buscas que cuando un jugador encuentre el numero, este no pueda volver a introducir números, pero el resto sí.

¿Porque no usas una flag? Estableces un booleano llamado por ejemplo numEncontrado que por defecto en todos los jugadores sea "false" y cuando dé con el número lo estableces a true, así antes de solicitar introducir un numero pones un if(numEncontrado).


Gracias por responder.
Pero lo que más necesito es como he puesto ahí de ejemplo, tal y como tengo el programa me hace un jugador entero y pasa al siguiente, lo que necesito es que por así decirlo vayan por turnos y en cada turno digan un número; jugador 1 dice número, jugador 2 dice número, jugador 3 dice número y vuelven a empezar diciendo otro número y así hasta encontrar el número correcto...

He estado probando y quitando el Hil.join(); hace lo que pido pero con el problema de que me repiten el número:

Código:
Número generado: 36
Número de jugadores: 3

Thread-1 Numero:6
Thread-3 Numero:6
Thread-2 Numero:6
Thread-2 Numero:42
Thread-1 Numero:42
Thread-3 Numero:42
Thread-2 Numero:83
Thread-1 Numero:83
Thread-3 Numero:83
Thread-2 Numero:30
Thread-1 Numero:30
Thread-3 Numero:30
Thread-2 Numero:36
Thread-3 Numero:36
Thread-1 Numero:36


Título: Re: Pausar y reanudar hilos
Publicado por: Barrendeitor en 24 Diciembre 2015, 07:09 am
Hola,
si lo he entendido bien, lo que quieres hacer es que los Threads prueben números por turnos.

Puedes pausar y reanudar Threads con los métodos:

Código:
Hil[i].suspend();
Hil[i].resume();

El problema es que son "deprecated", ya que dan problemas al usar monitores, según creo. Aunque no creo que en este caso haya problema. La alternativa que sugiere Oracle es utilizar los métodos wait() y notify().

Pausas el Thread en el punto que quieras llamando a wait(), en algunos casos no está de más tener un flag booleano y utilizarlo de la forma:

Código:
while(!flag) {
     wait();
}

Y reanudar el thread de la forma:

Código:
Hil[i].notify();

Prueba y nos cuentas, eso sí, tendrás que quitar el Hil[i ].join() y bucar la manera de que se vayan turnando haciendo solo un turno cada uno.