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

标签 java multithreading

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

相关文章:

java - 如何让 Comparator.comparing 正确推断类型参数?

java - Jmeter 是在自己的 JVM 中运行所有内容,还是为每个线程组创建一个 JVM?

java - 带有单元测试的 Xml Dom 库

Java线程生命周期

java - 多线程在 GUI JFrame 中显示 java 控制台日志

用于多线程服务器的 Java CachedThreadPool 与 FixedThreadPool

c - 信号处理程序是否需要包含在流程中的每个可能上下文中?

java swing/awt组件绘制棋盘

c - Pthread 服务器编程 : how to release a thread which is blocked on a recv call to handle a request from another thread

c++ - 应用于线程的延迟优先级更改