静态块和主线程

4

在尝试使用Java时,我发现了一件非常有趣的事情。请查看下面的代码:

public class SimpleTest { 
    static{ 
        System.out.println(Thread.currentThread().getName()); 
        System.exit(0); 
    } 
} 

上述程序没有产生任何异常(很好,因为我已经在静态块中退出了)。但是我得到了以下输出:
main
由于我没有启动主线程,那么它是如何创建的呢?据我的理解,在加载时执行静态块。那么主线程又是怎么出现的呢?
请问有人能够简要介绍一下JVM中的编译、加载和执行过程吗?还有rt.jar的用途是什么?
提前感谢, Brinal

关于额外问题(编译、加载、执行、rt.jar),它们与此无关,不应该在这里讨论。我建议您先阅读一些基础材料,然后再提出更具体的问题。 - Joachim Sauer
5个回答

7
当你运行任何Java程序时,主线程是第一个启动的线程。
你看到的输出并不表示main方法正在执行。相反,它是main线程
因此,每当你启动一个Java程序时,都会有一个叫做main的线程在执行。如果该线程立即退出JVM,则这将是所有将要运行的线程。
为了澄清:
静态块在加载类时执行。这是由类加载器执行的,并在Java程序启动时的主线程中执行。

你的意思是静态块在类加载时被加载,并且在主线程启动时执行。只是为了澄清一下。 - Brinal
1
@Brinal,顺序如下:主线程启动,类被加载,静态块执行。(在所有类都加载完毕后,将执行main方法。) - jjnguy

3
主类在主线程上加载和初始化。虽然这并没有明确地在任何地方记录(据我所知),但这是一个相当安全的假设,因为几乎没有理由以不同的方式实现它。

@Joachim Sauer:就我所知,主类在主线程中加载,但是谁启动了邮件线程?是JVM吗? - Harry Joy
是的,JVM启动该线程的方式与您没有static初始化程序块时完全相同。唯一的区别在于,在您通常看到它之前,会有一些用户代码运行在上面。 通常main线程的第一个迹象是执行main方法时。 - Joachim Sauer
@Joachim Sauer: 这意味着 JVM 将为一个类启动线程,无论是否存在 main 方法。 - Harry Joy
@Harry:main方法并不会启动main线程,它只是在其中运行。 - Joachim Sauer

1

所有的Java代码都在某个线程上执行。通常(并不出奇地),主线程被命名为“main”。通常情况下,主线程会加载主类(执行静态块),然后调用您的main方法。

然而,您似乎没有main方法,所以如果它已经从静态块中出来,您的程序将崩溃,并显示有关未找到main的异常。


0

一定有什么东西加载了你的SimpleTest类,这个东西必须是主线程(因为当前线程的名称表明了这一点)。如果没有看到调用代码,很难知道这里发生了什么 - 但是一定有什么东西导致SimpleTest类被加载,并且它在主线程上运行。


0

静态初始化并不总是在主线程上执行。

如果该类从另一个线程中的另一个类引用,那么静态初始化将不会在主线程上发生,而是在后台线程中进行,即在第一次调用时从后台线程中调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接