线程Join()方法输出?

时间:2016-08-26 06:54:27

标签: 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();
    }
}

2 个答案:

答案 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,而是等待stftst之间没有关系或等待seq。