jvm 静态块和主线程

blpfk2vs  于 2022-11-07  发布在  其他
关注(0)|答案(5)|浏览(210)

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

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

上面的程序运行时没有任何异常(很好,因为我在静态块中退出)。但我得到了以下输出:
主要的
因为我还没有启动主线程,它是如何被创建的。根据我的理解,静态块是在加载时执行的。那么主线程是如何进入画面的呢?
有没有人能简单介绍一下jvm的编译、加载和执行过程?还有rt.jar的使用?
提前谢谢你,Brinal

ar5n3qh5

ar5n3qh51#

运行任何Java程序时,主线程都是第一个启动的线程。
您所看到的输出并不是指示main * 方法 * 正在执行,而是main * 线程 * 正在执行。
因此,无论何时启动一个Java程序,都会有一个名为main executing的线程,如果该线程立即退出JVM,那么所有的线程都将运行。
澄清:
根据我的理解,静态块在加载期间执行。
静态块在类加载时执行。这是由类加载器完成的,并且在Java程序启动时在主线程中执行。

guykilcj

guykilcj2#

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

xe55xuns

xe55xuns3#

所有的Java代码都在某个线程上执行。通常(也不奇怪)主线程被命名为“main”。通常,主线程加载主类(它执行静态块),然后调用你的main方法。
但是,您似乎没有main方法,因此如果它已经从静态块中出来了,您的程序将崩溃,并出现一个关于找不到main的异常。

jchrr9hc

jchrr9hc4#

一定有什么东西加载了SimpleTest类,它一定是主线程(正如当前线程的名称所指示的)。如果不看到调用代码,很难知道这里发生了什么--但是有什么东西导致SimpleTest类被加载,并且它正在主线程外运行。

6za6bjd0

6za6bjd05#

静态初始化并不总是在主线程上执行
如果从另一个线程中的另一个类引用该类,则静态初始化不会发生在主线程上,而是发生在首次调用该类的后台线程中。

相关问题