我试图了解 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();
}
}
最佳答案
join 的作用是连接线程要完成的事情。
所以...
ft.start();
ft.join();
st.start();
st.join();
将等待 FT 线程完成后再启动 ST 线程,但是...
ft.start();
// ft.join();
st.start();
st.join();
...将启动 FT 线程,然后立即启动 ST 线程。
<小时/>关于你说的第二种情况:
I am getting output as (1212121212), I thought that output will be (1222221111). What I was thinking is right or wrong ?
你的想法是错误的。在第二种情况下,您有两个自由运行的线程,每个线程都在打印、 hibernate 、打印、 hibernate 等等。由于它们彼此不同步,因此两个线程都不会显式等待另一个线程。然而,时间安排使得它们(偶然地)交错各自的 print
语句。
请注意,无法保证此行为。如果系统负载很重,一个线程可能会由于不公平的调度程序行为而“超越”另一个线程,并且它们不会完全像那样交错。
st.join()
和 ft.join()
调用导致“this”线程(即“主”线程)等待 ST 线程或分别为 FT 线程。它们不会导致 ST 等待 FT……反之亦然。
关于java - 线程Join()方法输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39160085/