使用Join方法的不同输出

时间:2015-06-04 09:17:14

标签: java multithreading join

我阅读了一些教程,甚至已经问过问题here

但我再次对连接方法感到困惑。 我所知道Java在正常情况下无法保证线程的执行顺序。

我使用join()读取的内容,它确保一旦线程调用join,当前线程将不会执行,除非您调用join的线程已完成。

我试过的例子

public class ThreadTest1 extends Thread{

    @Override
    public void run() {
        super.run();
        for(int i=0; i<10; i++)
        {
            System.out.println(i + "   :"+ Thread.currentThread().getName());
        }
    }

    public static void main(String[] args) {

        System.out.println("Thread is getting started");
        ThreadTest1 th0= new ThreadTest1();
        th0.start();
        ThreadTest1 th1= new ThreadTest1();
        th1.start();
        try {
            th1.join(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

输出:

First time output
0   :Thread-1
1   :Thread-1
2   :Thread-1
0   :Thread-0
3   :Thread-1
1   :Thread-0
4   :Thread-1
2   :Thread-0
5   :Thread-1
3   :Thread-0
6   :Thread-1
4   :Thread-0
7   :Thread-1
8   :Thread-1
9   :Thread-1
5   :Thread-0
6   :Thread-0
7   :Thread-0
8   :Thread-0
9   :Thread-0
Second time output:
0   :Thread-1
0   :Thread-0
1   :Thread-1
1   :Thread-0
2   :Thread-1
2   :Thread-0
3   :Thread-1
3   :Thread-0
4   :Thread-1
4   :Thread-0
5   :Thread-1
5   :Thread-0
6   :Thread-1
6   :Thread-0
7   :Thread-1
7   :Thread-0
8   :Thread-1
8   :Thread-0
9   :Thread-1
9   :Thread-0

为什么两个输出都不同。

我在第1个对象中使用了join()。当th0正在运行并且jvm找到了th1线程所以thread-1应该先完成然后是Thread-0。

为什么它打印Thread-1,Thread-0没有任何顺序。如果输出将是这样的那么join()的用法是什么?

任何人都可以用我的输出来解释。

2 个答案:

答案 0 :(得分:1)

这里的问题是两个线程都独立启动并开始打印,th0.startth1.start之间发生的事情不确定。

此外,您的应用程序的主系统线程正在等待以完成th1th0th1 执行他们的{ {1}}方法彼此独立,这就是每次获得不同序列时的原因。

答案 1 :(得分:0)

请你试试下面的...

 try {
        th1.join();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

实际上,通过使用join(10000)方法,我们说要等待另一个线程的10000毫秒...如果其他线程没有在10000毫秒内完成,则开始执行当前线程。

join()的使用没有指定等待其他线程完成执行的时间......