2017-02-28 86 views
-2

我有一个简单的java程序。一个主线程(main())被创建并启动另一个线程tjava:为什么主线等待子线程完成

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虚拟机启动时,通常有一个 非守护线程(它通常会调用命名为主要的一些 指定类中的方法)。 Java虚拟机继续直至出现以下任何一种情况发生时执行 主题:Runtime类的

  • 退出方法被调用并且安全管理器允许退出操作发生。
  • 所有不是守护进程线程的线程都已死亡,可以通过从调用返回运行方法或通过抛出传播超出run方法的异常 。

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

+0

是什么让你觉得主线程没有退出? –

+0

这是一个愚蠢的错误:(@DavidSchwartz –

+0

我应该问为什么JVM而不是主线程 –

回答

4

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

+0

这可以通过在另一个线程中的print语句之后添加Thread.sleep(1000)而变得明显。 –

0

您制作的线程与main方法不同步。因此,调用t.start()后发生两个进程。一旦main结束,主进程完成,但线程仍在继续。

为了更好地观察此情况,请在线程的while循环而不是true的条件下使用布尔变量,以使线程仅打印5次。

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

请注意,如果没有办法终止它,线程将不会自行停止。主要方法结尾不会终止线程。

0

注释方法t.join()正是线程等待调用者线程结束所需的。请参阅线程javadoc以获取更多详细信息

0

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

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