java:为什么主线程等待子线程完成

时间:2017-02-28 17:56:07

标签: java multithreading

我有一个简单的java程序。创建主线程(main())并启动另一个线程t

class T extends Thread{
    @Override
    public void run() {
        while (true){
            System.out.println("Inside thread");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Thread t = new T();
        t.start();
        //t.join();
        System.out.println("end");
    }
}

输出:

end
Inside thread
Inside thread
Inside thread
....
....

它无限打印内线。我不是在使用join()等主线程中的子线程。打印结束后,主线程不应退出吗?

更新

  

当Java虚拟机启动时,通常只有一个   非守护程序线程(通常调用名为main的方法)   指定班级)。 Java虚拟机继续执行   线程,直到发生以下任一情况:

     
      
  • 已调用类Runtime的exit方法,安全管理器已允许退出操作。
  •   
  • 所有非守护程序线程的线程都已死亡,无论是通过调用run方法返回还是抛出异常   传播超出run方法。
  •   

我找到了原因。第二点澄清了它。我假设所有子线程将在主线程退出后终止(我错了)并且JVM应该关闭。

4 个答案:

答案 0 :(得分:4)

主线程已退出。这是另一个仍然活着的线程。

答案 1 :(得分:0)

您创建的主题与main方法不同步。因此,调用t.start()后会发生两个进程。一旦main结束,主要过程就完成了,但是线程t仍在继续。

为了更好地可视化,请在线程的情况下使用布尔变量而不是true来使线程只打印5次。

class T extends Thread{
    int count;
    @Override
    public void run() {
        while (count < 5){
            System.out.println("Inside thread");
            count++;
        }
    }
}

请注意,如果无法终止线程,则线程不会自行停止。结束的主要方法不会终止线程。

答案 2 :(得分:0)

注释方法t.join()正是线程等待调用者线程结束所需的内容。有关更多详细信息,请参阅Thread javadoc

答案 3 :(得分:0)

以下代码将永远运行。请修复你的while循环控制逻辑

while (true) {
System.out.println("Inside thread");
}