Foro de elhacker.net

Programación => Java => Mensaje iniciado por: kur79 en 30 Enero 2016, 18:40 pm



Título: Cuestión de hilos/concurrencia
Publicado por: kur79 en 30 Enero 2016, 18:40 pm
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
  1. public class programaConcurrencia {
  2.    public static void main(String[] args) {
  3.        FileClock reloj= new FileClock();
  4.        Thread hilo=new Thread(reloj);
  5.  
  6.        hilo.start();
  7.  
  8.        try{
  9.            TimeUnit.SECONDS.sleep(5);
  10.        }catch(InterruptedException e){
  11.            e.printStackTrace();
  12.        }
  13.        hilo.interrupt();  
  14.    }
  15. }
  16.  
  17. /////////////////////////////////////////
  18.  
  19. public class FileClock implements Runnable {
  20.  
  21.    @Override
  22.    public void run() {
  23.        for(int i=0;i<10;i++){
  24.            System.out.printf("%s\n",new Date());
  25.            try{
  26.                TimeUnit.SECONDS.sleep(1);
  27.            }catch(InterruptedException e){
  28.                System.out.println("El FileClock se ha detenido.");
  29.  
  30.            }
  31.        }
  32.    }
  33. }
  34.  

Como salida obtengo esto:
Código
  1. Sat Jan 30 11:09:04 CET 2016
  2. Sat Jan 30 11:09:05 CET 2016
  3. Sat Jan 30 11:09:06 CET 2016
  4. Sat Jan 30 11:09:07 CET 2016
  5. Sat Jan 30 11:09:08 CET 2016
  6. El FileClock se ha detenido.
  7. Sat Jan 30 11:09:09 CET 2016
  8. Sat Jan 30 11:09:10 CET 2016
  9. Sat Jan 30 11:09:11 CET 2016
  10. Sat Jan 30 11:09:12 CET 2016
  11. Sat Jan 30 11:09:13 CET 2016
  12. BUILD SUCCESSFUL (total time: 10 seconds)

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


Título: Re: Cuestión de hilos/concurrencia
Publicado por: El Benjo en 31 Enero 2016, 06:28 am
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.


Título: Re: Cuestión de hilos/concurrencia
Publicado por: avesudra en 1 Febrero 2016, 20:12 pm
Hola kur79 si te vas a la API de Java  (https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#interrupt%28%29)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.


Título: Re: Cuestión de hilos/concurrencia
Publicado por: MNicolas en 2 Febrero 2016, 10:18 am
Pon un break en el catch