我试图理解join()
Thread
实际上如何运作。
在以下代码中,当我仅使用ft.join()
时,输出会更正我们的预期:
1111122222
但是当我评论ft.join()
并仅使用st.join()
时,我的输出结果如下:
1212121212
我认为输出将是:
1222221111
使用st.join()
时,如何仍然输出“1212121212”?
class FT extends Thread {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("1");
try {
FT.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class ST extends Thread {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("2");
try {
FT.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class test {
public static void main(String[] args) throws InterruptedException {
FT ft = new FT();
ST st = new ST();
ft.start();
//ft.join();
st.start();
st.join();
}
}
答案 0 :(得分:2)
联接线程要完成的是什么联接。
所以......
ft.start();
ft.join();
st.start();
st.join();
将在启动ST线程之前等待FT线程完成,但是......
ft.start();
// ft.join();
st.start();
st.join();
...将启动FT线程,然后立即启动ST线程。
关于你说的第二个案例:
我输出为(1212121212),我认为输出将是(1222221111)。我的想法是对还是错?
你的想法是对的。在第二种情况下,您有两个自由运行的线程,分别是打印,睡眠,打印,睡眠等。由于它们没有彼此同步,因此两个线程都没有明确地等待另一个线程。但是,时间是这样的,它们(偶然地)交错各自的print
语句。
请注意,此行为无法保证。如果系统负载很重,一个线程可能会超过&#34;另一个是由于不公平的调度程序行为,并且它们不会完全交错。
st.join()
和ft.join()
来电导致&#34;此&#34;线程(即&#34; main&#34;线程)分别等待ST线程或FT线程。它们不会导致ST等待FT ......反之亦然。
答案 1 :(得分:0)
在jdk8中,官方文件解释了这个功能如下:
public final void join() 抛出InterruptedException
等待此线程死亡。
这意味着当前线程将等待新线程,直到新线程死亡
在你的代码中,join()通知主线程等待FT / ST线程直到它们死亡。
当您“评论ft.join()
并仅使用st.join()
”时,表示主线程不会等待ft
,而是等待st
。 ft
和st
之间没有关系或等待seq。