2012-02-09 11 views
7

Esto es puramente una pregunta teórica ya que no estoy seguro de que las condiciones para causar este problema sean comunes.Cómo detener la devolución de un thread antes de que Join() se llame

decir, por ejemplo que haya un hilo que se iniciará con que es empezar método:

Thread c = new Thread(); 
c.start(); 

Entonces inmediatamente después, se llama al método join() en la rosca para contar el método que está en esperar hasta que el hilo se haya ejecutado para continuar.

c.join(); 

¿No es una posibilidad de que el hilo podría ser ejecutado y terminar antes de que el método de unión se llama, por lo tanto, dejando el método sin saber que tenía que esperar a que c termine antes de que siguió? Supongo que podría intentar llamar al método join() antes de llamar al método start(), pero cada vez que lo intento en casos de prueba, aparece un error.

Alguien sabe una posible solución para esto, o la maneja JVM? Como dije, no he podido desencadenar este tipo de situación, pero teóricamente es posible ...

+0

¿Por qué es un problema? –

+0

Con las respuestas que otros han opinado, no será erróneo concluir que join() en cualquier otro Thread, es solo una verificación de criterios, para el Thread que realiza la llamada. – soufrk

Respuesta

10

De acuerdo con el código fuente Thread#join(long millis), el método isAlive() se utiliza para verificar el estado del hilo.

/** 
* Tests if this thread is alive. A thread is alive if it has 
* been started and has not yet died. 
* 
* @return <code>true</code> if this thread is alive; 
*   <code>false</code> otherwise. 
*/ 
public final native boolean isAlive(); 

Este método, obviamente, vuelve false si el mensaje ha terminado, por lo thread.join() inmediatamente se cerrará.

0

La semántica del método de unión significa "esperar hasta que se termine el hilo de unión", y eso es más o menos el estándar en todos los lenguajes de programación que admiten multi-threading. Por lo tanto, es perfectamente posible unir un hilo ya terminado, la JVM simplemente detectará que ya ha finalizado y procederá con la ejecución del código.

6

c.join() significa que el subproceso que se está ejecutando actualmente debe esperar a que c se complete antes de finalizar. Si c se ejecuta por completo antes de que se realice la llamada a c.join(), entonces se cumple esa condición, ya que c ha completado la ejecución. El método en el que llama al c.join() no lo "sabrá"; c.join() sería simplemente como no-op.

0

join() volverá inmediatamente si el hilo no se está ejecutando.

2

Puede llamar al join() antes de iniciar un hilo, pero como el hilo no se ha iniciado join() devolverá inmediatamente.

Si se llama a join() después de que se inicia el hilo y el hilo ha terminado, join() también volverá inmediatamente.

La única vez join() bloqueará es mientras que el Thread.isAlive()

Este código funciona bien ...

public static void main(String[] args) throws InterruptedException 
    { 
     Thread t = new Thread(new Runnable() 
     { 
     public void run() 
     { 
      System.out.println("thread"); 
     } 
     }); 
     t.join(); 
     System.out.println("joined"); 

     Thread.sleep(2000); 
     System.out.println("call start"); 
     t.start(); 
    } 
Cuestiones relacionadas