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
不关心。并且主线程也不“切换”