elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Pausar y reanudar hilos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pausar y reanudar hilos  (Leído 4,835 veces)
Ninja_Kyubi

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Pausar y reanudar hilos
« 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 


En línea

Atry

Desconectado Desconectado

Mensajes: 90



Ver Perfil
Re: Pausar y reanudar hilos
« Respuesta #1 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).


En línea



Le parkour!
mI video! ---> http://www.youtube.com/watch?v=nT9A8L4eK9M
Espero k os guste ;D
Ninja_Kyubi

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Pausar y reanudar hilos
« Respuesta #2 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
En línea

Barrendeitor

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Re: Pausar y reanudar hilos
« Respuesta #3 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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Reanudar sesión Reaver (Wifiway 3.4)
Wireless en Linux
wfcron 0 4,663 Último mensaje 18 Septiembre 2012, 15:20 pm
por wfcron
[Solucionado] Pausar y reanudar programa.
Programación C/C++
erovira 7 7,354 Último mensaje 13 Marzo 2014, 15:53 pm
por erovira
[SQLMAP] Reanudar consulta con session.sqlite
Nivel Web
Kanamex 1 1,439 Último mensaje 17 Noviembre 2023, 16:18 pm
por LlopoRobot
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines