Java中的join()方法如何工作?

时间:2014-03-27 08:35:48

标签: java join

class JoinDemo extends Thread {
    JoinDemo(String nm) {
        setName(nm);
        start();
    }
    public void run() {
        for (int i = 1; i <= 5; i++) {
            try {
                Thread.sleep(100);
            } catch (Exception e) {
                System.out.println(e);
            }
            System.out.println(i);
        }
        System.out.println(getName() + " exiting.");
    }
    public static void main(String args[]) {
        JoinDemo t1 = new JoinDemo("One");
        JoinDemo t2 = new JoinDemo("Two");
        JoinDemo t3 = new JoinDemo("Three");

        try {
            t1.join();
        } catch (Exception e) {
            System.out.println(e);
        }
        System.out.println("Main Thread Exits now.");
    }
}

获得的输出是:

1
1
1
2
2
2
3
3
3
4
4
4
5
5
Three exiting.
One exiting.
5
Main Thread Exiting
Two exiting. 

我在浏览各种网站后编写了上述程序,以了解Join()的概念。但我仍然无法得到它。我面临的问题是我使用了t1.join()。所以线程一应该在三个之前退出,但是这里的三个线程在一个之前退出。每次运行程序时输出都不同。有时它会在一个之前退出,或者在一个之前退出三个。不应该在任何其他线程之前线程退出一个?当t1.join()等待线程1在三个和一个??

之前终止

4 个答案:

答案 0 :(得分:1)

不,你误解了join()的效果。

当你执行t1.join()时,你只是断言线程t1将在继续程序之前完成。

正如你所看到的那样,

One exiting.
5
Main Thread Exiting

在由Main Thread Exiting符号化的主要结尾之前的一个出口。

如果你希望你的程序在完成之前完成所有线程,你应该这样做:

try {
        t1.join();
        t2.join();
        t3.join();
    } catch (Exception e) {
        System.out.println(e);
    }

如果你想要一个完成然后2然后3

    JoinDemo t1 = new JoinDemo("One");
    try {
        t1.join();
    } catch (Exception e) { System.out.println(e); }

    JoinDemo t2 = new JoinDemo("Two");
    try {
        t2.join();
    } catch (Exception e) { System.out.println(e); }

    JoinDemo t3 = new JoinDemo("Three");
    try {
        t3.join();
    } catch (Exception e) { System.out.println(e); }

答案 1 :(得分:0)

要确切知道join()正在做什么,

JoinDemo t1=new JoinDemo("One");
t1.join();
JoinDemo t2=new JoinDemo("Two");
JoinDemo t3=new JoinDemo("Three");

在声明t1之后调用该方法并查看。

join()方法将使已经初始化的线程首先完成。所以其他Threads将等到那时。

答案 2 :(得分:0)

t1.join()只是确保您的主线程会阻塞,直到t1完成。与其他两个线程相比,您无法控制t1完成的速度。

t1t2t3受线程调度程序的支配。您的代码中唯一的保证是t1将在主线程之前完成。

答案 3 :(得分:0)

您正在运行3个不同的主题。每个线程使用的CPU的优先级或数量取决于java实现,在某些情况下,它由操作系统完成。这就是你获得不同输出的原因。 连接使正在运行的线程等到关节线程死亡。

我想你想要这个输出:

   class JoinDemo extends Thread {
    JoinDemo(String nm) {
        setName(nm);
    }
    public void run() {
        for (int i = 1; i <= 5; i++) {
            try {
                Thread.sleep(100);
            } catch (Exception e) {
                System.out.println(e);
            }
            System.out.println(i);
        }
        System.out.println(getName() + " exiting.");
    }
    public static void main(String args[]) {
        JoinDemo t1 = new JoinDemo("One");
        JoinDemo t2 = new JoinDemo("Two");
        JoinDemo t3 = new JoinDemo("Three");
        try {            
            t1.start();
            t1.join();
            t2.start();
            t2.join();
            t3.start();
            t3.join();

        } catch (Exception e) {
            System.out.println(e);
        }
        System.out.println("Main Thread Exits now.");
    }
}