所有其他线程完成后如何在最后运行主线程

时间:2015-07-01 18:34:06

标签: java multithreading

我想知道thread's join()方法的工作原理。我假设当我们在t.join()之后给出t.start()时,其余的线程可能是main将在Thread t完成其进程后执行。当我执行以下代码时:

public class Run extends Thread {
    void go(){
        System.out.println(isAlive());
    }
    public static void main(String[] args) throws Exception{
        Thread t=new Run();
        t.start();
        //t.join();
        ((Run)t).go();
    }   
}

我可以在输出中获得truefalse。如果t.start()((Run)t).go()之前执行,则输出将为truefalse但我希望始终true获得输出。所以我取消注释行t.join(),以便main线程的((Run)t).go()在最后执行。但现在我总是得到false的输出。我以为它是真的。任何人都可以清除我的困惑吗?我知道我没有包含Thread的run()方法。

4 个答案:

答案 0 :(得分:1)

https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#join--

  

等待此线程死亡。

您的程序有两个线程:主线程和Run实例。当主线程调用t.join()时,它将等待t死亡,然后继续。因此,在Thread.join()返回之后,根据定义,线程将会死亡。

答案 1 :(得分:0)

  

我想知道thread的join()方法是如何工作的。

它是如何工作的?或它做了什么?

它的作用是,t.join()等待线程t失效。 (即,你称之为,并且在t死亡之前它不会返回。)

它是如何工作的,它位于循环中,测试线程的状态,如果线程还没有死,则调用t.wait()。线程在死时所做的最后一件事就是更改其状态,然后调用t.notifyAll()

答案 2 :(得分:0)

  

但我希望始终获得输出true。所以我取消注释行t.join(),以便主线程((Run)t).go()在最后执行。

如果您希望结果为true,则需要确保在检查时线程处于活动状态;最简单的方法是从正在运行的线程(即,来自线程的目标run()方法)进行检查,但是如果需要从另一个线程进行检查,则需要创建同步线程之间的机制,如CountdownLatch。然后,线程将等待直到主线程已检查其状态。

但是,这一切看起来都非常人为。 join()方法等待另一个线程死亡。如果在join()成功完成后检查该线程,当然您会看到它没有活动。

答案 3 :(得分:0)

join() - 等待线程死亡。enter code here

class JoinDemo{
   Thread thread1 = new Thread(
                 new Runnable() {
                     public void run () {
                         //your code logic goes here
                     }
                  }
    );
    Thread thread2 = new Thread(
                 new Runnable() {
                     public void run () {
                         //your code logic goes here
                     }
                  }
    );
    thread1.start(); //line1
    thread1.join();  //line2
    thread2.start();//line3
}

这个例子中有3个线程,main,thread1,thread2。目前运行的线程即。 main将等待thread1死掉。在thread1死后,它将继续执行thread2。 因此主线程只有在thread1死后才会进入第3行。