当前位置: 首页 > 面试题库 >

为什么线程比Java中的main方法寿命更长?

梁嘉祥
2023-03-14
问题内容

我在自学Java线程时,发现有些令我困惑的地方。我做了一个叫做engine实现的课程Runnable。run方法仅打印“ Hello
World”,休眠一秒钟,然后重复。

在我的主要方法中,我有:

public static void main(String[] args) {
    Thread thread = new Thread(engine);
    thread.start();
    System.out.println("Done.");
}

如我所料,我看到了“ Hello World”和“
Done”。快速打印,这意味着main方法已到达末尾,但是我没想到的是,即使到达main末尾后,我开始运行的线程仍保持运行。

为什么即使退出主程序后程序仍继续执行?我曾以为,当main退出时,该过程将终止,并且所有线程将被强制清理。这是否意味着要终止Java程序,必须显式地加入/杀死每个线程?


问题答案:

如果您希望程序在main方法完成时退出,请考虑使线程守护程序生效。但是请注意,当main完成时,守护程序线程将被中止。
您可以这样创建一个守护进程:

Thread t = new Thread(...);
t.setDaemon(true);

所有非守护程序线程都是用户线程。这些线程正在阻止jvm关闭。



 类似资料:
  • 问题内容: 我的导师告诉我,主线程是每个线程的父线程,但他无法解释原因。 当我编写一个简单的程序时: 然后在执行时会引发异常: 方法和主线程之间有什么关系? 问题答案: main()方法和Main Thread之间有什么关系吗? JVM启动时,它将创建一个名为“ Main”的线程。您的程序将在此线程上运行,除非您自己创建其他线程。 “主”线程要做的第一件事是查找您的方法并调用它。那就是程序的切入点

  • > 我看到接口只允许实现方法。那么为什么我们甚至需要这个接口呢?为什么我们不能简单地在我们想要的任何类中定义和声明该方法,而无需实现接口? 我知道这是正确的:

  • 问题内容: 为什么Java中的main方法总是需要参数?为什么我们每次都要写,而不是在使用任何参数时才写? 这样的方法会生成编译器错误。由于我们从不对main方法使用任何参数,因此应允许这样做。 这不是面试问题。编程时才想到。 问题答案: 基本上,有四个答案: 因为那是它的设计方式。是的,我知道这是一个循环的原因。但是关键是这就是它的样子,并且不会改变。因此,除非您打算设计自己的语言,否则这个问题

  • 为什么Java中的main方法总是需要参数?为什么我们每次都要编写,而不是在使用任何参数时编写它? 像这样的方法会生成编译器错误。由于我们从不对main方法使用任何参数,因此应该允许这样做。 这不是面试问题。编程的时候突然想到的。

  • 问题内容: 为什么在Java 8中允许接口具有方法? 如下面的代码所述,它可以正常工作并正确产生输出。 目前它的行为就像一个类,我已经用main方法执行了。 我们为什么需要这个? 问题答案: 从Java 8开始,接口中允许使用静态方法。 main()是静态方法。 因此,在接口中允许main()。 我们 不需要 它,因为以前不允许这样做,但是我们幸存了下来。但是,根据定义,由于静态方法不是绑定到类的

  • 问题内容: 由于它可能是Java语言中使用最广泛的方法之一,因此为什么它必须接受字符串数组并且没有它就无法工作?例如,我可以一直住: 过度 除了能够接受命令行参数之外,还有其他更高的目的吗,尤其是因为绝大多数Java程序都是GUI驱动的,并且不需要通过命令行接收args? 问题答案: 甚至GUI驱动的Java应用程序也将从某些主要方法开始。“更高的目的”从来没有接受命令行参数。 目的只是接受参数。