Java 线程连接是否暂停';之后的所有线程;加入';陈述

Java 线程连接是否暂停';之后的所有线程;加入';陈述,java,multithreading,Java,Multithreading,我在线程连接中有一个查询。查询是线程联接是否意味着联接之后的所有线程都将暂停,直到其上面的线程成功完成 在下面的代码中,我放置了一个one.join在一个之后。start 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();

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

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

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()之后:

我得到的结果如下所示,表明它阻塞了三个和四个线程,直到一个和两个线程完成

第一个0
第二个0
第一个1
第二个1
第二个2
前2个
第二个3
前3个
第二个4
前4个
第四个0
第三个0
第三个1
第四个1
第三个2
第四个2
第三个3
第四个3
第三个4
第四个4

t.join()
在线程
t
失效时返回。它做到了这一点,并建立了一个“before”关系,这意味着调用方保证能够在join()调用返回后看到线程在内存中触及的所有内容

这基本上就是要在Java程序中正确使用它所需要知道的关于
t.join()
的所有内容


如果你这样写:

one.start();
one.join();
two.start();
join调用对线程
two
没有任何作用。事实上,它对线程
one
也没有任何作用。它只影响调用者

Java语句按顺序执行。上面是由三个语句组成的序列
one.start()
启动线程
one.join()
等待该线程终止
two.start()
启动另一个线程


在序列中的前一条语句完成之前,无法执行一条语句。因此,
two.start()
只有在
one.join()
返回后才能执行,而这在
one
线程死亡之前不会发生,因为这就是
one.join()
所做的:它等待线程死亡。

join
不会阻止其他线程,只有调用
join
的线程才会被阻止。您的代码无法启动其他线程,因为您的主线程本身已被阻止。@Tom为什么在我错误放置
one.join()
时会出现不同的输出?我已经告诉过您,您的主线程将被阻止。因此,它可以在
join
调用之前执行所有操作,并且必须等到调用之后才能执行所有操作。那么,我们如何从主线程块解决这个问题呢?主线程被阻塞?->不要调用
join
。或者其他线程无法启动?->启动它们,然后调用
join
one.start();
one.join();
two.start();