Cuestión de hilos/concurrencia

Iniciado por kur79, 30 Enero 2016, 18:40 PM

0 Miembros y 1 Visitante están viendo este tema.

kur79

Buenas, tengo el programa de dejo abajo y se supone que debe mostrar 5 veces la hora y entonces bloquearse el hilo pero continúa hasta el final del bucle. Sé que debe hacer eso pero no entiendo el por qué. Llevo un par de días atascado en esta cuestión.

Código (java) [Seleccionar]

public class programaConcurrencia {
    public static void main(String[] args) {
        FileClock reloj= new FileClock();
        Thread hilo=new Thread(reloj);
       
        hilo.start();
       
        try{
            TimeUnit.SECONDS.sleep(5);
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        hilo.interrupt(); 
    }
}

/////////////////////////////////////////

public class FileClock implements Runnable {

    @Override
    public void run() {
        for(int i=0;i<10;i++){
            System.out.printf("%s\n",new Date());
            try{
                TimeUnit.SECONDS.sleep(1);
            }catch(InterruptedException e){
                System.out.println("El FileClock se ha detenido.");
               
            }
        }
    }
}


Como salida obtengo esto:
Código (cpp) [Seleccionar]

Sat Jan 30 11:09:04 CET 2016
Sat Jan 30 11:09:05 CET 2016
Sat Jan 30 11:09:06 CET 2016
Sat Jan 30 11:09:07 CET 2016
Sat Jan 30 11:09:08 CET 2016
El FileClock se ha detenido.
Sat Jan 30 11:09:09 CET 2016
Sat Jan 30 11:09:10 CET 2016
Sat Jan 30 11:09:11 CET 2016
Sat Jan 30 11:09:12 CET 2016
Sat Jan 30 11:09:13 CET 2016
BUILD SUCCESSFUL (total time: 10 seconds)


Acabo de empezar con temas de concurrencia y de java y ando perdido en esto.

El Benjo

Si te fijas bien, tu bucle for esta programado para ejecutarse 10 veces en lugar de 5. Otra cosa que deberías de mejorar. Lo que no logro entender es por qué tu hilo se sigue ejecutando sin y, además, sin lanzar de nueva cuenta la excepción que indica que se ha interrumpido. Lo que te recomiendo hacer es colocar la sentencia que imprime la hora dentro de tu try. Lamento no poder ayudarte más pues no se me da la programación multihilo en java.
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

avesudra

Hola kur79 si te vas a la API de Java del método interrupt() verás que:

If this thread is blocked in an invocation of the wait(), wait(long), or wait(long, int) methods of the Object class, or of the join(), join(long), join(long, int), sleep(long), or sleep(long, int), methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException.

Es decir que al estar el hilo bloqueado por una llamada a sleep, lo que haces es deshacer el bloqueo y provocar una Excepción, haciendo que el hilo vuelva a activarse para continuar con su ejecución. Por ese motivo te imprime el mensaje las 5 veces restantes.

Un saludo.
Regístrate en

MNicolas