gpt4 book ai didi

java - 线程Join()方法输出?

转载 作者:行者123 更新时间:2023-12-02 03:24:25 25 4
gpt4 key购买 nike

我试图了解 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com