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

主线程将在子线程完成执行之前退出?

白成济
2023-03-14
问题内容

主线程将在子线程完成执行之前退出?

我读了两篇文章

http://www.cs.mtu.edu/~shene/NSF-3/e-Book/FUNDAMENTALS/thread-
management.html

在以上文章的“线程终止”段中,它用红色表示“如果父线程终止,则其所有子线程也终止。”

http://www.roseindia.net/java/thread/overview-of-
thread.shtml

在上面的文章中,该页的最后一行指出“ main()方法执行可以完成,但是程序将一直运行,直到所有线程完成执行为止。”。

我认为他们是矛盾的。如果我错了,请专家纠正我。

在我的程序中,具有Main方法的程序调用2个线程的构造函数。在各个线程的构造函数中,我具有start()方法。

     TestA  A = new TestA("TestA");
     TestB  B = new TestB("TestB");

     public TestA(String name) {
    System.out.println(name);
    t = new Thread(this);
    t.start();
}

我想知道会发生什么,主线程在子线程完成执行之前终止?如果是这样,子线程将继续执行吗?

我尝试运行该程序,有时即使主线程退出,所有子线程也会执行完毕。在2个线程中,我正在处理一些文件。在testA线程A中,单独的1个文件有时未得到处理。但很多时候,所有文件都在处理中,我没有任何问题。


问题答案:

Java区分用户线程和另一种称为守护程序线程的线程。这两种类型的线程之间的区别在于,如果JVM确定在应用程序中运行的唯一线程是守护程序线程(即,没有用户线程),则Java运行时将关闭应用程序。另一方面,如果至少有一个用户线程处于活动状态,则Java运行时不会终止您的应用程序。

当main()方法最初从Java运行时接收控制时,它将在用户线程的上下文中执行。只要主方法线程或任何其他用户线程保持活动状态,您的应用程序就会继续执行。

在您的情况下,线程是用户线程,因此可以在主线程退出之前完成。

我正在处理一些文件。在testA线程A中,单独的1个文件有时未得到处理。但是很多次

发生上述情况的原因可能是线程退出以外的其他原因。可能是文件锁定,同步问题等。

https://docs.oracle.com/javase/10/docs/api/java/lang/Thread.html:

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

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



 类似资料:
  • 我试图理解Python线程的“守护进程”标志。这我知道 线程可以标记为“守护线程”。此标志的意义在于,当只剩下守护进程线程时,整个Python程序将退出。初始值从创建线程继承。 但在我的例子中,python程序在守护进程线程离开并且线程没有完成其工作之前退出。 主程序 第一个线程只写5000个第一个整数,而第二个线程不写任何数字

  • 这是我正在研究的完全未来的例子 首先我从SupplySync调用compose方法,在这里我执行方法composeMethod,有三毫秒的延迟,然后它将创建一个文件并返回一个字符串作为结果。完成后,我调用Run方法,它只打印一个方法,然后有一个非阻塞方法从主线程运行。 我在这里面临的问题是,主线程执行完nonblockingmethod()并在3毫秒延迟之前退出进程,而随后的composeMeth

  • 问题内容: 我相信主线程不能在子线程之前死亡。但是有什么办法可以检查吗?我在下面写了一个简单的程序。有人能证明它几乎把理论放在一边吗? 经过詹姆斯的建议。我尝试了以下程序。 问题答案: 从http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html: Java虚拟机将继续执行线程,直到发生以下任何一种情况: 已调用类Runtime的退

  • 我是spring batch的新手。我已经使用多个线程从spring创建并成功执行了作业,它工作得很好,只是当程序执行完成时,程序流不会结束/停止。i、 即使main方法的最后一条语句被执行,程序也不会退出。我不确定它是否一直在等待线程完成,或者是什么。有人能给我一些建议吗?“下面是我的作业配置文件 下面是启动器代码 如上所述,代码在5个不同的线程中为任务“hello”运行,为任务“world”运

  • 我打算在主线程中启动2个线程,主线程应该等到所有2个子线程完成,我就是这样做的。 在上面的代码中,确实让主线程等待子线程,但问题是,在第一个线程完成之前不会创建第二个线程。这不是我想要的。 我想要的是,这两个线程立即在主线程中创建,然后主线程等待它们完成。似乎做不到,是吗? 我想,也许我可以通过一个信号灯来完成这项工作,但还有别的方法吗?

  • 我确信这两个列表都不是空的,并且正在调用,但是没有调用order execution run方法....