【问题标题】:java: why main thread waits for child thread to finishjava:为什么主线程等待子线程完成
【发布时间】:2017-07-19 19:57:03
【问题描述】:

我有一个简单的 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() 等待主线程中的子线程。打印end后主线程不应该退出吗?

更新:

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

  • 已调用 Runtime 类的退出方法,并且安全管理器已允许执行退出操作。
  • 所有不是守护线程的线程都已经死亡,要么是从调用 run 方法返回,要么是抛出异常 传播到 run 方法之外。

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

【问题讨论】:

  • 是什么让你觉得主线程没有退出?
  • 这是一个愚蠢的错误 :( @DavidSchwartz
  • 我应该问为什么JVM而不是主线程

标签: java multithreading


【解决方案1】:

主线程已经退出。这是另一个仍然存在的线程。

【讨论】:

  • 这可以通过在另一个线程的 print 语句之后添加 Thread.sleep(1000) 来变得明显。
【解决方案2】:

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

为了更好地可视化这一点,请在线程的 while 循环条件中使用布尔变量而不是 true 以使其仅打印 5 次。

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

请注意,如果无法终止线程,它不会自行停止。 main 方法结束不会终止线程。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2022-01-02
        • 2011-06-09
        • 1970-01-01
        • 2012-07-22
        • 2020-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多