我在尝试使用java时发现了一个非常有趣的事情。请查看下面的代码:
public class SimpleTest {
static{
System.out.println(Thread.currentThread().getName());
System.exit(0);
}
}
上面的程序运行时没有任何异常(很好,因为我在静态块中退出)。但我得到了以下输出:
主要的
因为我还没有启动主线程,它是如何被创建的。根据我的理解,静态块是在加载时执行的。那么主线程是如何进入画面的呢?
有没有人能简单介绍一下jvm的编译、加载和执行过程?还有rt.jar的使用?
提前谢谢你,Brinal
5条答案
按热度按时间ar5n3qh51#
运行任何Java程序时,主线程都是第一个启动的线程。
您所看到的输出并不是指示
main
* 方法 * 正在执行,而是main
* 线程 * 正在执行。因此,无论何时启动一个Java程序,都会有一个名为main executing的线程,如果该线程立即退出JVM,那么所有的线程都将运行。
澄清:
根据我的理解,静态块在加载期间执行。
静态块在类加载时执行。这是由类加载器完成的,并且在Java程序启动时在主线程中执行。
guykilcj2#
主类是在主线程上加载和初始化的。虽然这在任何地方都没有明确的文档(据我所知),但这是一个相当安全的假设,因为几乎没有理由以不同的方式实现它。
xe55xuns3#
所有的Java代码都在某个线程上执行。通常(也不奇怪)主线程被命名为“main”。通常,主线程加载主类(它执行静态块),然后调用你的
main
方法。但是,您似乎没有
main
方法,因此如果它已经从静态块中出来了,您的程序将崩溃,并出现一个关于找不到main
的异常。jchrr9hc4#
一定有什么东西加载了SimpleTest类,它一定是主线程(正如当前线程的名称所指示的)。如果不看到调用代码,很难知道这里发生了什么--但是有什么东西导致SimpleTest类被加载,并且它正在主线程外运行。
6za6bjd05#
静态初始化并不总是在主线程上执行
如果从另一个线程中的另一个类引用该类,则静态初始化不会发生在主线程上,而是发生在首次调用该类的后台线程中。