2011-05-06 8 views
5

esto es como defino mi hilo¿Cómo obtener el estado de un hilo?

public class Countdown implements Runnable{ 

    public Countdown(){ 
     new Thread(this).start(); 
    } 

    //... 
} 

¿Es todavía posible para obtener el estado de un hilo si se inicia de esa manera? Como

Countdown cd = new Countdown(); 
cd.getState(); 

Respuesta

5

No. No lo es.

Si desea obtener el estado, debe mantener una referencia al subproceso; p.ej.

public class Countdown implements Runnable{ 
    private final Thread t; 

    public Countdown(){ 
     t = new Thread(this); 
     t.start(); 
    } 

    public Thread.State getState() { 
     return t.getState(); 
    } 
    // ... 
} 

Por cierto, hay otras razones por las que esto no es un gran modelo:

  • Si se pierde la referencia al objeto Countdown (por ejemplo, debido a una excepción durante la construcción del objeto principal), se filtrará un hilo.

  • La creación de hilos e hilo consume muchos recursos. Si hay muchos de estos objetos Countdown, o si tienen una vida útil corta, entonces sería mejor utilizar un grupo de subprocesos.

+1

me gustaría hacer la rosca 'final'. ;) –

3

Usted puede hacer

public class Countdown implements Runnable{ 
    private final Thread thread; 
    public Countdown(){ 
     (thread = new Thread(this)).start(); 
    } 

    public Thread.State getState() { 
     return thread.getState(); 
    } 
} 
2

Dado que es sólo la aplicación de Runnable tendrá que proveedor de un método de envoltura para obtener el estado:

class Countdown implements Runnable { 
    private final Thread thread; 

    public Countdown() { 
     thread = new Thread(this); 
     thread.start(); 
    } 

    public Thread.State getState() { 
     return thread.getState(); 
    } 
} 
+0

Grandes mentes ... –

+0

Veo que combinó dos líneas en una sin embargo, no había pensado usar eso en este caso antes. – WhiteFang34

1

Siento decirlo, pero debería nunca inicie un hilo desde el constructor. Ese constuctor está pidiendo problemas. Cambie para que el instaurador de Countdown esté creando el hilo.

+0

No creo que necesariamente sea siempre malo iniciar un hilo en el constructor. Sin embargo, debe tener cuidado al respecto, asegúrese de iniciarlo al final del constructor. Para referencia de por qué puede ser una mala práctica, consulte http://www.ibm.com/developerworks/java/library/j-jtp0618/index.html – WhiteFang34

+1

También hay otras razones por las que no debe crear un hilo en un constructor, y especialmente con el código que el OP ha publicado. La clase está implementando, y por lo tanto exponerse como Runnable. Eso indica a otros desarrolladores que deberían comenzar/crear el hilo. También podría meterse en problemas si alguien está subclasificando el código publicado. – Kaj

1

Recomendaría utilizar el método run() y asignar allí el hilo en ejecución, no en el c-tor. Algo a lo largo de las líneas.

public class Countdown implements Runnable{ 
volatile Object thread = State.NEW; 
public void run(){ 
    this.thread = Thread.currentThread(); 
    try{ 
///.... 
    }finally{ 
    this.thread = State.TERMINATED; 
    } 

} 

State getState(){ 
    Object t=this.thread; 
    return t instanceof State?((State)t):((Thread)t).getState(); 
} 

}

Cuestiones relacionadas