Java 线程连接()方法输出?

Java 线程连接()方法输出?,java,multithreading,Java,Multithreading,我试图了解join()在Thread中是如何工作的 在下面的代码中,当我仅使用ft.join()时,输出得到了我们预期的纠正: 1111122222 但当我评论ft.join()并仅使用st.join()时,我得到的输出是: 12121212 我认为输出将是: 122221111 使用st.join()时,我如何仍然获得输出“12121212” class FT扩展线程{ @凌驾 公开募捐{ 对于(int i=0;i

我试图了解
join()
Thread
中是如何工作的

在下面的代码中,当我仅使用
ft.join()
时,输出得到了我们预期的纠正:

1111122222

但当我评论
ft.join()
并仅使用
st.join()
时,我得到的输出是:

12121212

我认为输出将是:

122221111

使用
st.join()
时,我如何仍然获得输出“12121212”

class FT扩展线程{
@凌驾
公开募捐{
对于(int i=0;i<5;i++){
系统输出打印项次(“1”);
试一试{
英尺睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
}
类ST扩展线程{
@凌驾
公开募捐{
对于(int i=0;i<5;i++){
系统输出打印项次(“2”);
试一试{
英尺睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
公开课考试{
公共静态void main(字符串[]args)引发InterruptedException{
FT=新的FT();
ST=新ST();
ft.start();
//ft.join();
st.start();
圣约翰();
}
}

联接所做的就是联接线程完成的工作

所以

ft.start();
ft.join();
st.start();
st.join();
将在启动ST线程之前等待FT线程完成,但是

ft.start();
// ft.join();
st.start();
st.join();
…将启动FT线程,然后立即启动ST线程


关于第二种情况,你说:

我得到的输出是(12121212),我认为输出是(122222111)。我所想的是对的还是错的

您的想法是错误的。在第二种情况下,您有两个自由运行的线程,每个线程都在打印、睡眠、打印、睡眠等。由于它们彼此不同步,因此两个线程都没有显式地等待另一个线程。但是,时间安排是这样的(偶然)交错它们各自的
打印
语句

请注意,这种行为是不能保证的。如果系统负载很重,一个线程可能会因为不公平的调度程序行为而“超过”另一个线程,并且它们不会完全像那样交错


st.join()
ft.join()
调用分别导致“this”线程(即“main”线程)等待st线程或ft线程。它们不会导致st等待ft…或反之亦然。

join所做的是连接线程完成的操作

所以

ft.start();
ft.join();
st.start();
st.join();
将在启动ST线程之前等待FT线程完成,但是

ft.start();
// ft.join();
st.start();
st.join();
…将启动FT线程,然后立即启动ST线程


关于第二种情况,你说:

我得到的输出是(12121212),我认为输出是(122222111)。我所想的是对的还是错的

您的想法是错误的。在第二种情况下,您有两个自由运行的线程,每个线程都在打印、睡眠、打印、睡眠等。由于它们彼此不同步,因此两个线程都没有显式地等待另一个线程。但是,时间安排是这样的(偶然)交错它们各自的
打印
语句

请注意,这种行为是不能保证的。如果系统负载很重,一个线程可能会因为不公平的调度程序行为而“超过”另一个线程,并且它们不会完全像那样交错


st.join()
ft.join()
调用分别导致“this”线程(即“main”线程)等待st线程或ft线程。它们不会导致st等待ft…或反之亦然。

在jdk8中,官方文档对该函数的解释如下:

公共最终无效联接() 抛出中断异常

等待此线程死亡

这意味着当前线程将等待新线程,直到新线程死亡。
在代码中,join()通知主线程等待FT/ST线程,直到它们停止。
当您“注释
ft.join()
并仅使用
st.join()
”时,这意味着主线程将不等待
ft
,而是等待
st
。在jdk8中
ft
st

之间没有关系或等待序列,官方文档对该函数的解释如下:

公共最终无效联接() 抛出中断异常

等待此线程死亡

这意味着当前线程将等待新线程,直到新线程死亡。
在代码中,join()通知主线程等待FT/ST线程,直到它们停止。
当您“评论
ft.join()
并仅使用
st.join()
”时,这意味着主线程将不等待
ft
,而是等待
st
。并且
ft
st

之间没有关系或等待序列,再次测试,也不进行连接测试。使用
ft.join
连接
d的位置非常相关。我试过了很多时候,当我只使用st.join()时,输出是(12121212)或(212121),我不知道它是对的还是错的,我想输出会像(122221111)一样,因为在进入st线程后,我使用的是st.join()因此,st线程将在切换回ft线程之前完成其执行。不,
join
不会阻止其他线程同时运行,它只会等待线程死亡,然后继续执行下一行代码。
st.join
之后的下一行代码是退出程序,因此在al上没有任何用处l、 我不明白你为什么期望“1222221111”…如果主线程加入并等待
st
,则
ft
不关心。并且主线程也不“切换”