2011-05-03 80 views
14

Java线程的join()方法让我困惑了一下。我有下面的例子了解join()方法示例

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+"] "); 

而且

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(); 
    } 
} 

在其顺序线程终止?

+4

这是一个诡计问题吗?或作业? :) – bzlm 2011-05-03 16:45:36

+0

刚刚读了一些电子书,发现这个例子,实际上执行线程等待线程在哪里加入被称为完成,也许我今天就退出:D – 2011-05-03 16:50:27

+0

等待线程死亡。 http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html#join() – 2011-05-03 16:51:05

回答

12

究竟是什么使您对Thread.join()感到困惑?你没有提到任何具体的东西。

鉴于Thread.join()(如the documentation states),Waits for this thread to die,然后t4将等待t3来完成,这将等待t2来完成,这将等待t1完成。

因此t1将首先完成,然后是t2,t3t4

6

它将以t1,t2,t3,t4 ...的顺序结束... join使当前正在执行的线程等待,直到它所调用的线程终止。

2

有一个主线程启动您创建的四个海关线程t1,t2,t3和t4。现在,如果在线程上调用join()方法并且没有提供参数(time)(默认情况下它为0,意味着最大等待时间是永久的),那么调用线程将等待调用连接的线程终止。

当调用t1.start()时,它的相应的run()方法被JVM调用。因为t1的waitsFor参数为null,它只会通过打印它的名字来终止。由于您正在添加睡眠t2,t3,t4会在t1完成睡眠时开始。现在t2将等待t​​1终止,因为我们正在从t2调用t1上的join。同样,t3将等待t2,t4将等待t3。所以你执行会去t1->t2->t3->t4

但是,如果t1在t2调用加入之前终止,则加入将简单地返回,因为此时(t2调用t1时加入)isAlive()将为false