繁体   English   中英

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

[英]how to run main thread at the end after all other threads completed

我想知道thread's join()方法是如何工作的。 我假设当我们在t.join()之后t.start() ,其余的线程可能是main的线程将在线程 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() t.start()之前执行,则输出将为truefalse但我希望输出始终为true 所以我取消注释t.join() ,以便main线程的((Run)t).go()在最后执行。 但现在我总是得到输出为false 我希望这是真的。 任何人都可以清除我的困惑吗? 我知道我没有包含 Thread 的run()方法。

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

等待这个线程死亡。

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

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

这个怎么运作? 或者它有什么作用?

它所做的是, t.join()一直等到线程t死了。 (即,你调用它,直到t死了它才会返回)。

它的工作原理是,它处于一个循环中,测试线程的状态并在线程尚未死亡时调用t.wait() 线程在死亡时所做的最后一件事是改变它的状态,然后调用t.notifyAll()

但我想像往常一样得到输出true 所以我取消注释t.join() ,以便主线程的((Run)t).go()在最后执行。

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

然而,这一切似乎都非常做作。 join()方法等待另一个线程死亡。 如果您在join()成功完成后检查该线程,您当然会看到它不是活动的。

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。 所以主线程只有在线程 1 死后才会进入行 3。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM