4

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

如果我调用:会发生什么B.join()

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

4

6 回答 6

10

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

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

于 2009-12-13T19:57:00.770 回答
8

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

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

}
于 2009-12-13T19:57:05.060 回答
3

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

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

t.join();

导致当前线程暂停执行,直到 t 的线程终止。连接的重载允许程序员指定一个等待时间。但是,与 sleep 一样,join 的时间取决于操作系统,因此您不应假设 join 将等待您指定的时间。

我强烈推荐 Java 教程作为学习资源。

于 2009-12-13T20:12:57.667 回答
2

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

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

于 2009-12-13T20:05:25.617 回答
0

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

于 2009-12-13T19:57:23.603 回答
0

无论您从哪个线程调用 B.join() 都会阻塞并等待 B 完成。

于 2009-12-13T19:58:12.967 回答