2011-05-03 16 views
14

El método Java join() de thread me confunde un poco. He ejemplo siguienteComprender el método join() ejemplo

class MyThread extends Thread { 
    private String name; 
    private int sleepTime; 
    private Thread waitsFor; 

    MyThread(String name, int stime, Thread wa) { … } 

    public void run() { 
     System.out.print("["+name+" "); 

     try { Thread.sleep(sleepTime); } 
     catch(InterruptedException ie) { } 

     System.out.print(name+"? "); 

     if (!(waitsFor == null)) 
     try { waitsFor.join(); } 
     catch(InterruptedException ie) { } 

     System.out.print(name+"] "); 

Y

public class JoinTest2 { 
    public static void main (String [] args) { 
     Thread t1 = new MyThread("1",1000,null); 
     Thread t2 = new MyThread("2",4000,t1); 
     Thread t3 = new MyThread("3",600,t2); 
     Thread t4 = new MyThread("4",500,t3); 
     t1.start(); 
     t2.start(); 
     t3.start(); 
     t4.start(); 
    } 
} 

¿En qué orden se terminan los hilos?

+4

¿Es esta una pregunta capciosa? ¿O tarea? :) – bzlm

+0

acaba de leer un libro electrónico y encontré ese ejemplo, en realidad el hilo de ejecución espera el hilo donde se llama a las uniones para terminar, tal vez debería salir hoy: D –

+0

Espera a que el hilo muera. http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html#join() –

Respuesta

12

¿Qué es lo que realmente le confunde sobre Thread.join()? No has mencionado nada específico.

Dado que Thread.join() (como the documentation states), Waits for this thread to die, a continuación, esperar a que se t4t3 para completar, que esperará a t2 para completar, que esperará a t1 en completarse.

Por lo tanto, t1 completará primero, seguido de t2, t3 y t4.

6

Terminará en orden t1, t2, t3, t4 ... join hace que el subproceso que se está ejecutando actualmente espere hasta que finalice el subproceso al que se llama.

2

Hay un hilo principal que inicia los cuatro hilos de aduana que ha creado t1, t2, t3 y t4. Ahora cuando se invoca el método join() en un hilo y no se proporciona ningún argumento (tiempo), lo que lo convierte en 0 por defecto, significando que el tiempo máximo de espera es para siempre, el hilo llamante esperará a que el hilo en el que se invocó la unión termine.

Cuando se llama a t1.start(), la JVM invoca el método run() correspondiente. Como el argumento waitsFor es nulo para t1, terminará simplemente imprimiendo su nombre. Dado que está agregando sueño t2, t3, t4 se iniciarán para cuando t1 complete su suspensión. Ahora t2 esperará a que t1 termine cuando llamemos join en t1 desde t2. De forma similar, t3 esperará a t2 y t4 esperará a t3. Así que la ejecución será t1->t2->t3->t4.

Sin embargo, si t1 termina antes de que las llamadas t2 se unan, la unión simplemente regresará porque en ese punto (cuando t2 llama a join en t1) isAlive() será false.

Cuestiones relacionadas