了解join()

时间:2009-12-13 19:50:42

标签: java join multithreading scjp

假设线程A正在运行。我有另一个帖子,B,谁不是。 B已经启动,处于可运行状态。

如果我致电:B.join()会怎样?

它会暂停执行A还是会等待A的run()方法完成?

6 个答案:

答案 0 :(得分:8)

join()将使当前正在执行的线程等待它被调用的线程死掉。

所以 - 如果A正在运行,你调用B.join(),A将停止执行,直到B结束/死亡。

答案 1 :(得分:6)

加入等待直到线程死亡。如果你在死线程上调用它,它应该立即返回。这是一个演示:

public class Foo extends Thread {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("Start");

        Foo foo = new Foo();
        try {
            // uncomment the following line to start the foo thread.
            // foo.start();
            foo.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Finish");
    }

    public void run() {
        System.out.println("Foo.run()");
    }

}

答案 2 :(得分:3)

来自http://java.sun.com/docs/books/tutorial/essential/concurrency/join.html

  

join方法允许一个线程   等待另一个完成。如果   t是一个Thread对象,其线程是   目前正在执行,

t.join();
     

导致当前线程暂停   执行直到t的线程终止。   连接过载允许程序员   指定等待期。然而,   与睡眠一样,加入取决于   操作系统的计时,所以你不应该   假设加入将完全等待   只要你指定。

我强烈建议将Java Tutorial作为学习资源。

答案 3 :(得分:2)

在线程上调用join方法会导致调用线程等待线程join()被调用以完成。它不会影响任何其他不是调用者或被调用者的线程。

在你的例子中,如果你从A调用B.join(),A只会等待B完成。如果C正在调用B.join(),则A的执行不受影响。

答案 4 :(得分:0)

我认为如果A是当前运行的线程。对B.join()的调用将暂停,直到B的run()方法完成。这是对的吗?

答案 5 :(得分:0)

您调用B.join()的线程将阻止并等待B完成。