2010-06-29 29 views
5

Estaba probando un ejemplo del método isAlive() de enhebrado de java. Pero encontré que el método isAlive() devuelve false incluso si el hilo ya se ha iniciado. ¿Puede alguien decirme qué estoy haciendo mal? Aquí está el fragmento de código.El método isAlive() de la cadena Java no funciona correctamente?

package app; 

public class ThreadAliveDemo { 

    public static void main(String[] args) { 

     Thread myThread; 

     myThread = new Thread() 
     { 
      public void run() 
      { 
          Thread.sleep(3000); 
       System.out.println("My Thread."); 
      } 
     }; 

     myThread.setName("My Thread"); 
     myThread.start(); 

     if(!myThread.isAlive()) 
     { 
      myThread.setName("My Thread"); 
      myThread.start(); 
     } 

    } 

} 
+1

use Thread.getState() en su lugar, proporciona información adicional. comenzar un hilo dos veces tampoco tiene ningún efecto. – bestsss

+0

En cuanto al consejo de @bestsss: el libro de Brian Goetz, Java Concurrency in Practice, dice: "El resultado de Thread.getState no debe usarse para el control de concurrencia y tiene una utilidad limitada para probar . Su utilidad principal es como fuente de depuración información." – WoodenKitty

+0

@WoodenKitty, mientras que un subproceso no se ha iniciado getState() sería estable (puede necesitar cierta sincronización con el inicio del subproceso). El consejo de Goetz es muy sólido, pero no es aplicable en este caso. – bestsss

Respuesta

3

Si mi memoria me sirve bien java tiene periodos bastante largos entre el cambio de hilo por lo que es posible que isAlive falle porque el hilo es todavía no vivo. Intente agregar un poco de tiempo de espera entre thread.start() y thread.isAlive()

+0

Intenté hacer que el hilo durmiera durante 3 segundos pero teniendo el mismo problema. – Rise

+0

tratar de hacer el sueño subproceso de llamada para un segundo (_AND_ dejar que el hilo del sueño del niño 3 segundos) – dbemerlin

+0

ha funcionado a la perfección .. Muchas gracias. – Rise

10

Hay una buena probabilidad habrá comenzado el hilo, ejecutado y terminado, entre su llamada a start() y su llamada a isAlive().

Java no ofrece garantías sobre la secuencia en que ocurren estas cosas. Podría ejecutar el hilo generado inmediatamente, o puede optar por diferirlo hasta un poco más tarde.

Por cierto, su código está tratando de reiniciar el hilo después de que haya muerto. Esta es not permitted:

Nunca es legal para iniciar un hilo más de una vez. En particular, un hilo no se puede reiniciar una vez que ha completado la ejecución.

Llamar a start() después de comprobar isAlive() nunca va a funcionar.

+0

Sí ... Necesito envolver un bloque 'sincronizado' alrededor de mi cerebro y mis dedos – skaffman

+1

No, intenté usar Thread.sleep (3000); llamar dentro del método de ejecución. Todavía estoy recibiendo el mismo problema. – Rise

+0

Pero, ¿cómo es posible? He hecho que mi hilo duerma durante 3 segundos. y luego verificó la llamada isAlive(). Y creo que en este caso, la llamada de Lifetime() debe ser verdadera, pero aún así está devolviendo el resultado verdadero. – Rise

1

Todavía no he hecho ningún subprocesamiento múltiple en Java, pero me parece que su hilo probablemente se habrá ejecutado y salido antes de la comprobación isAlive(). Después de todo, parece que tu hilo solo imprime algo y luego muere.

1

No veo el sentido del código que ha publicado. Thread.start() inicia el hilo: no necesita iniciarlo dos veces. No veo cómo su código puede ser realista en una situación en la que tiene un subproceso y no sabe si se ha iniciado o no; de todos modos hay muchas formas de codificar eso para que no pueda suceder.

+1

No se trata de usar el código como está en una situación de la vida real, pero se trata de hacer los conceptos claros. – Rise

+0

Pero todo lo que significa es que el hilo no se ha iniciado realmente cuando start() regresa. Es asincrónico, sabes. No veo qué concepto se está ilustrando. – EJP

Cuestiones relacionadas