我在尝试使用java时发现了一件非常有趣的事情。请找到以下代码:
public class SimpleTest {
static{
System.out.println(Thread.currentThread().getName());
System.exit(0);
}
}
上面的程序运行没有任何异常(好吧和好,因为我在静态块本身退出)。但我得到以下作为输出:
主要
由于我没有启动主线程,它是如何创建的。根据我的理解,静态块在加载时执行。然后主线如何进入图片?
任何人都可以简要介绍如何在jvm中完成编译,加载和执行?还使用rt.jar?
提前致谢, Brinal
答案 0 :(得分:7)
运行任何Java程序时,主线程是第一个启动的线程。
您看到的输出并未表明正在执行main
方法。而是main
线程。
因此,无论何时启动Java程序,您都将拥有一个名为main execution的线程。并且,如果该线程立即退出JVM,那么这就是所有将运行的线程。
澄清:
根据我的理解,静态块在加载时执行。
加载类时执行静态块。这是由类加载器发生的,并在Java程序启动时在主线程中执行。
答案 1 :(得分:3)
主类在主线程上加载并初始化。虽然这在任何地方都没有明确记录(据我所知),但这是一个非常安全的假设,因为几乎没有理由以不同的方式实现它。
答案 2 :(得分:1)
所有Java代码都在某个线程上执行。通常(并且不出所料)主线程被命名为“main”。通常,主线程加载主类(执行静态块),然后调用main
方法。
但是,您似乎没有main
方法,因此如果它已经从静态块中删除,那么您的程序将崩溃,并且找不到main
的异常。
答案 3 :(得分:0)
某些东西必须加载你的SimpleTest类,它必须是主线程(正如当前线程的名称所示)。在没有看到调用代码的情况下,很难知道这里发生了什么 - 但是有些东西导致SimpleTest类被加载并且它正在主线程上运行。