Thread#join是否会暂停“join”语句后跟随的所有线程?

时间:2016-05-06 11:39:14

标签: java multithreading

我在线程连接中有一个查询。查询是线程连接是否意味着在连接之后所有线程都将暂停,直到它上面的线程成功完成为止

在下面的代码中,我在one.start之后放置了 one.join

One one = new One();
Two two = new Two();
Three three = new Three();
Four four = new Four();

one.start();
one.join();  // join placed after one.start
two.start();
three.start();
four.start();

我得到了下面给出的结果,表明它阻塞了两个,三个和四个线程,直到第一个线程完成它。

  

首先0
  第1页   前2个   前3个   前4个   第二个0   第三个0   第四个0   第二个1   第四个1   第三个1   第二个2   第三个2   第四2   第二个3   第四个3   第三个3   第二个4   第四4   第三个4

现在,在下面的代码中,我在one.join()之后放置了two.start()

One one = new One();
Two two = new Two();
Three three = new Three();
Four four = new Four();

one.start();
two.start();
one.join();  // join placed after two.start
three.start();
four.start();

我得到了下面给出的结果,表明它阻塞了三个和四个线程,直到一个和两个线程完成。

  

首先0
  第二个0   第1页   第二个1   第二个2   前2个   第二个3   前3个   第二个4   前4个   第四个0   第三个0   第三个1   第四个1   第三个2   第四2   第三个3   第四个3   第3 4   第四季度

1 个答案:

答案 0 :(得分:3)

当线程t.join()死亡时,

t返回。它就是这样做的,它确定了一个"发生在"关系,意味着调用者保证在join()调用返回后能够看到线程在内存中触及的所有内容。

基本上,您需要了解有关t.join()的所有内容,以便在Java程序中正确使用它。

如果你这样写:

one.start();
one.join();
two.start();

加入调用不会对线程two执行任何操作。事实上,它也没有做任何线程one。它只影响来电者。

Java语句按顺序执行。上面是一系列三个陈述。 one.start()启动一个帖子。 one.join()等待该线程终止。 two.start()启动另一个帖子。

在序列中的前一个语句完成之前,不能执行一个语句。因此,在two.start()返回之前,one.join()无法执行,并且在one线程死亡之前不会发生,因为one.join()是什么<p:commandButton value="Go" update="userTokens" actionListener="#{userAdministrationBean.fetchUserTokens}" /> <p:pickList value="#{userAdministrationBean.userTokensList} " id="userTokens" var="token" itemLabel="#{token}" itemValue="#{token}"> </p:pickList> }:它等待线程死亡。