2010-11-23 19 views
12

En un programa java de subprocesos múltiples, ¿qué sucede si se ha creado una instancia de un objeto de hebra T y luego se ha llamado a T.join() antes de que se haya iniciado el subproceso? Supongamos que algún otro hilo podría llamar a T.start() en cualquier momento después de que T haya sido instanciado, ya sea antes o después de que otro hilo invoque a T.join().¿Cuál es el comportamiento de Thread.join() en Java si el objetivo aún no se ha iniciado?

Pregunto porque creo que tengo un problema donde se ha llamado a T.join() antes de T.start(), y el hilo que llama a T.join() se cuelga.

Sí, sé que tengo algunos problemas de diseño que, de ser corregidos, podrían hacer que esto no sea un problema. Sin embargo, me gustaría conocer los detalles del comportamiento de join(), porque lo único que dicen los documentos de la API de Java es "Espera a que este hilo se muera".

+1

Pruébalo. Haga otro proyecto simple y vea lo que sucede. – BeemerGuy

+3

BeemerGuy: Tal vez lo haga, en algún momento. Sin embargo, no estoy seguro de que la prueba y el error por sí solos iluminarán completamente lo que está sucediendo detrás de escena. Siempre existe la posibilidad de que alguien más lo sepa y puede ahorrarme tiempo. – DGH

Respuesta

11

Simplemente volverá. Vea el código a continuación: isAlive() será falso antes de que comience el hilo, por lo que no sucederá nada.

public final synchronized void join(long millis) 
    throws InterruptedException { 
    long base = System.currentTimeMillis(); 
    long now = 0; 

    if (millis < 0) { 
      throw new IllegalArgumentException("timeout value is negative"); 
    } 

    if (millis == 0) { 
     while (isAlive()) { 
     wait(0); 
     } 
    } else { 
     while (isAlive()) { 
     long delay = millis - now; 
     if (delay <= 0) { 
      break; 
     } 
     wait(delay); 
     now = System.currentTimeMillis() - base; 
     } 
    } 
    } 

El fragmento de código es © Derechos de autor de Oracle 2006 y/o sus filiales, y pueden ser found here. Licencia bajo Java Research License.

+0

Lo que has pegado aquí es join (long millis). ¿Qué pasa con join()? No creo que los comportamientos sean los mismos para ambos métodos. – DGH

+0

@DGH: join() llamadas join (0). –

+0

@Nathan Hughes: Bien, eso lo explica, gracias. – DGH

-1

Debería esperar indefinidamente hasta que termine el hilo ... lo que en su caso nunca sucede hasta donde yo entiendo.

Cuestiones relacionadas