2012-03-11 135 views
7

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

我读2篇

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中,单独一个文件没有被处理一些时间。但很多时候,所有的文件都得到处理,我没有任何问题。

回答

20

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

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

在你的情况下,线程是用户线程,因此允许在主线程退出前完成。

我正在处理一些文件。在单独测试线程A中,仅有1个文件是 未被处理一些时间。但很多次

上述原因可能是线程退出。这可能是文件锁定,同步问题等

Java Thread API documentation

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

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

+0

感谢您的详细解释。你已经提到“在你的情况下,线程是用户线程,因此在主线程退出前允许完成。”在这里你的意思是“主线程”是Java运行时而不是主方法()的程序。正确? – user1257836 2012-03-11 06:08:03

+0

具有main方法的类和在main方法内部创建的线程都是用户线程。所有这些线程都是独立的并发执行。因为我给了System.out.println(“主要方法的退出”);主要方法的结尾。这会在子线程中的system.out.println()之前打印。这让我觉得主线程(具有main方法的类)甚至可以在子线程之前退出。这种行为是否正确和正确? – user1257836 2012-03-11 06:14:53

+0

您能否澄清一下您的文件锁是什么意思?提前致谢!! – user1257836 2012-03-11 19:01:52

2

一旦主线程退出,它会带着孩子。也许通过“完成”第二篇文章只是意味着除了等待孩子之外没有更多的操作。一旦主线程调用System.exit(0);它已经结束 - 每个人都死亡。

假设你有两个线程在运行:threadA和threadB。在主要方法。第一个代码是终止线程的好方法 - 只是众多方法之一:

threadA.start(); 
threadB.start(); 
final long intercept = 300; 
long startTime = System.currentTimeMillis(); 
while (threadA.isAlive() && mis.isAlive()) { 
    threadA.join(intercept); 
if (System.currentTimeMillis() - startTime > intercept) { 
    threadB.interrupt(); 
    threadA.interrupt(); 
    threadA.join(); 
} 
} 
System.exit(0); 

下面是从内部主杀死所有线程的突然道:

System.exit(0); 
+0

感谢您的回复。我从来没有在我的程序中使用过System.exit(0)。“一旦主线程退出,它会带着这些孩子一起”.am仍然不清楚。具有main方法的程序创建2个线程并完成它。但产生的子线程将继续,是不正确的? – user1257836 2012-03-11 06:44:46

3

的后台线程会继续运行,即使主线程完成。

如果你想MAIN来阻止它们(例如,当MAIN完成时),让你的MAIN设置一个“keep running”标志变量(你必须设置为“volatile”),线程偶尔会看到这个变量。当MAIN想要阻止它们时,MAIN将它设置为false(变量)或null(对象)。当它为false或null时,线程必须“返回”。

这实现起来有些复杂,有很多方法,但最简单的方法是让你的Runnable成为一个内部类,这样你的Runnable就可以轻松共享标志了。

为了获得最佳实现,请在Java applets的启动/停止例程中查找此技术。

相关问题