了解join()方法示例

时间:2011-05-03 16:42:58

标签: java multithreading

Java thread 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 个答案:

答案 0 :(得分:12)

您真正对Thread.join()感到困惑的是什么?你没有提到具体的事情。

鉴于Thread.join()(为the documentation states),Waits for this thread to diet4将等待t3完成,等待t2完成,等待t1完成。

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

答案 1 :(得分:6)

它将以t1,t2,t3,t4 ...连接的顺序终止,导致当前正在执行的线程等待,直到它被调用的线程终止。

答案 2 :(得分:2)

有一个主线程可以启动你创建的四个海关线程t1,t2,t3和t4。现在,当在线程上调用join()方法并且没有提供参数(时间)时(默认情况下它使0表示最长等待时间是永久的),则调用线程将等待调用连接的线程终止。

当调用t1.start()时,JVM会调用相应的run()方法。由于对于t1,waitsFor参数为null,因此只需通过打印它的名称即可终止。由于你正在添加睡眠t2,t3,t4将在t1完成睡眠时启动。现在t2将等待t​​1终止,因为我们从t2调用t1上的join。类似地,t3将等待t2,t4将等待t3。所以执行将t1->t2->t3->t4

但是如果t1在t2调用join之前终止,则join将返回,因为在那时(当t2调用t1上的join时)isAlive()将为false

答案 3 :(得分:0)

线程终止的顺序当然是来自t1,t2等等。也许您将从此处清楚地了解java线程中的join()方法http://findnerd.com/list/view/Java-Thread-Join-Example/4465/