2012-07-15 16 views
5

Considere el siguiente código:¿Cómo funciona el método join() de la clase Thread?

class ThreadJoinTest{ 
    public static void main(String[] arguments){ 
     TimeUnit unit; 
     final Thread taskThread = new Thread(task); 
     taskThread.start(); 
     taskThread.join(unit.millis(timeout)); 
    } 
} 

Así que cuando el hilo principal sería ejecutar la línea de taskThread.join() con un valor de tiempo, el hilo principal está dando la taskThread tiempo suficiente para terminar su tarea? ¿Es este el objetivo principal del método de unión?

¿Qué pasará si:

  1. taskThread termina su ejecución antes de que el tiempo de espera período?
  2. ¿Qué sucede si se alcanza el tiempo de espera pero el taskThread no se ha terminado de ejecutar? ¿El taskThread tiene la oportunidad de terminar su tarea o no?
  3. ¿Cómo sabe el hilo principal que la unión volvió porque el taskThread terminó normalmente o porque se alcanzó el tiempo de espera?

Respuesta

5
  1. main se le permitirá volver a empezar tan pronto como sea taskThread es hecho.
  2. Luego, main podrá reiniciarse y taskThread continuará. Ambos hilos podrán terminar.
  3. Si el taskThread finalizó normalmente o si se alcanza el tiempo de espera, main continuará ejecutándose. No hay forma de que main sepa si se ha agotado el tiempo de espera o si se ha ejecutado taskThread sin utilizar otros medios de comunicación.
+0

Creo que su respuesta responde a las dos primeras preguntas, pero no a la tercera. Dado que el retorno de join es de tipo void, ¿cómo sabe el hilo principal si el Thread taskThread se completó normalmente o debido al tiempo de espera? – Geek

+0

@Geek: se agregó más información. – Keppil

+0

así que es esto un defecto en el diseño ... ¿qué piensas? – Geek

4

join() cuando se le llama en el hilo, esperarán a que el hilo de morir (es decir, para el método de ejecución de ese hilo que hacer con ..) A continuación, sólo la línea por debajo de la join() se ejecutará. Pero dar un tiempo de espera dentro de join() hará que el efecto join() se anule después del tiempo de espera específico.

Aunque se agota el tiempo de espera, taskThread podrá finalizar el trabajo.

+0

por lo tanto, suponiendo que se agote el tiempo de espera y que taskThread aún no se haya completado, ¿taskThread muere debido al tiempo de espera? – Geek

+0

No, incluso después de que se agote el tiempo de espera, el taskhTread podrá finalizar su trabajo –

+0

ok lo obtuve. ¿Qué hay de la última pregunta? Por favor, también vea mi comentario sobre la respuesta de Keppil. – Geek

1

La condición de tiempo de espera tendrá prioridad. Cuando se alcanza el tiempo de espera, el hilo principal y taskThread son candidatos igualmente probables para ejecutar.

Cuestiones relacionadas