This question already has answers here:
termination of program on main thread exit?
(2个答案)
4年前关闭。
主线程将在子线程完成执行之前退出?
我读了两篇文章
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()方法。
我想知道会发生什么,主线程在子线程完成执行之前终止?如果是这样,子线程将继续执行吗?
我尝试运行该程序,有时即使主线程退出,所有子线程也会执行完毕。
在2个线程中,我正在处理一些文件。在testA线程A中,单独的1个文件有时未得到处理。但很多时候,所有文件都在处理中,我没有任何问题。
(2个答案)
4年前关闭。
主线程将在子线程完成执行之前退出?
我读了两篇文章
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运行时将关闭应用程序。另一方面,如果至少有一个用户线程处于 Activity 状态,则Java运行时不会终止您的应用程序。
当main()方法最初从Java运行时接收控制时,它将在用户线程的上下文中执行。只要主方法线程或任何其他用户线程保持 Activity 状态,您的应用程序就会继续执行。
在您的情况下,线程是用户线程,因此允许它们在主线程退出之前完成。
发生上述情况的原因可能是线程退出以外的其他原因。可能是文件锁定,同步问题等。
https://docs.oracle.com/javase/10/docs/api/java/lang/Thread.html:
关于java - 主线程将在子线程完成执行之前退出? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9651842/