java静态块和主线程
我在尝试java时发现了一件非常有趣的事情。请查找以下代码:
public class SimpleTest {
static{
System.out.println(Thread.currentThread().getName());
System.exit(0);
}
}
上面的程序运行时没有任何异常(很好,因为我在静态块中退出)。但我得到了以下输出:
main
因为我还没有启动主线程,它是如何创建的。据我所知,静态块是在加载期间执行的。那么主线是如何进入画面的呢
有谁能简单介绍一下jvm是如何编译、加载和执行的?还有rt.jar的使用
提前感谢,, 海水的
# 1 楼答案
所有Java代码都在某个线程上执行。通常(也不出所料)主线程被命名为“main”。通常,主线程加载主类(执行静态块),然后调用
main
方法但是,您似乎没有
main
方法,因此,如果它从静态块中取出,您的程序将崩溃,并且找不到关于main
的异常# 2 楼答案
运行任何Java程序时,主线程都是第一个启动的线程
您看到的输出并不表示
main
方法正在执行。相反,它是main
线程所以,只要启动Java程序,就会有一个名为main executing的线程。而且,如果该线程立即退出JVM,那么这就是将要运行的所有线程
为了澄清:
静态块在类加载时执行。这是由类加载器实现的,当Java程序启动时,会在主线程中执行
# 3 楼答案
一定有什么东西加载了SimpleTest类,它一定是主线程(如当前线程的名称所示)。如果看不到调用代码,就很难知道这里发生了什么——但是有什么东西导致SimpleTest类被加载,并且它正在脱离主线程
# 4 楼答案
主类在主线程上加载和初始化。尽管这在任何地方都没有明确的记录(据我所知),但这是一个相当安全的假设,因为几乎没有理由以不同的方式实现它
# 5 楼答案
静态初始化并不总是在主线程上执行
如果该类从另一个线程中的另一个类被引用,静态初始化将不会在主线程上发生,而是在第一次调用该类的后台线程中发生