这个线程join()如何按给定的方式工作?

时间:2013-07-10 22:01:24

标签: java multithreading

我是java的新手,目前正在使用培训材料,其中以下代码生成以下输出:

Run. Run. doIt

如何打印 Run。两次? t.join()如何工作?

public class TestTwo extends Thread {
    public static void main (String[] a) throws Exception {
        TestTwo t = new TestTwo();
        t.start();
        t.run();
        t.join();
        t.doIt();
    }
    public void run() {
        System.out.print("Run. ");
    }
    public void doIt() {
        System.out.print("doIt. ");
    }
  }

4 个答案:

答案 0 :(得分:4)

t.start()开始执行新线程,该线程将执行t.run()中的代码。但是对t.start()的呼叫将立即恢复;它不会等待该线程完成run()的执行。在t.start()返回后,主线程运行t.run()。最后,它将等待t线程完成,这是t.join()所做的。此方法将立即返回,而是等待线程完成。 (碰巧的是,在这种情况下,这将非常快 - 但它可能需要几分钟,几小时甚至是永久。)

控制流看起来像这样:

Thread A
|
+- t.start() ---> starts Thread B
+- t.run()               +- t.run()
|                        |
+- t.join() waits for B  |
|           to finish    |
|               \------> +- Thread B stops
+- t.doIt()
+- Thread A stops

答案 1 :(得分:1)

t.run();

是一个无关紧要的电话。

当您使用t.start()启动帖子时,它会独立启动。这会在屏幕上显示“运行”。

然后,t.run(运行线程的run(方法,打印run。这两个“run”打印件可以按任意顺序排列。

最后,我们致电t.join。这等待线程终止(在通过设计连接打印之后,以及在运行打印之后,因为run调用在之前并且阻塞。

以阻塞方式调用join doIt函数后。

简而言之,main和t线程都打印run,然后主线程等待t线程完成以打印doIt

虽然许多调用是t线程行为的一部分,但有些独立于实例。

答案 2 :(得分:1)

start()方法导致线程对象执行(执行时是不确定的),JVM调用run()方法。

但你也直接致电run(),这就是run()执行两次的原因。

调用join()等待线程死亡,这在run()方法完成后发生。

答案 3 :(得分:1)

它也可以打印

RRuunn..  doIt