3

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

Run. Run. doIt

它如何打印运行。两次?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

4 回答 4

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
于 2013-07-10T22:04:55.207 回答
1
t.run();

是一个无关电话。

当您启动线程时,t.start()它会独立启动。这会将“运行”打印到屏幕上。

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

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

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

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

尽管许多调用是t线程行为的一部分,但在某种程度上独立于实例。

于 2013-07-10T22:04:57.753 回答
1

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

但是您也run()直接调用,这就是run()执行两次的原因。

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

于 2013-07-10T22:06:04.430 回答
1

它也可以打印

RRuunn..  doIt
于 2013-07-11T00:09:16.730 回答