我是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. ");
}
}
答案 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