4

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

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

上面的程序运行没有任何异常(很好,因为我正在退出静态块本身)。但我得到以下输出:

主要的

由于我还没有启动主线程,它是如何创建的。根据我的理解,静态块是在加载期间执行的。那么主线程是如何出现的呢?

谁能简单介绍一下jvm中的编译,加载和执行是如何完成的?还有用rt.jar吗?

在此先感谢,布林纳

4

5 回答 5

7

当您运行任何 Java 程序时,主线程是第一个启动的线程。

您看到的输出并不表明该main 方法正在执行。而是main 线程

因此,无论何时启动 Java 程序,都会有一个名为 main 的线程正在执行。而且,如果该线程立即退出 JVM,那么这就是所有将运行的线程。

澄清:

根据我的理解,静态块是在加载期间执行的。

加载类时执行静态块。这由类加载器发生,并在 Java 程序启动时在主线程中执行。

于 2011-05-31T13:09:59.080 回答
3

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

于 2011-05-31T13:10:43.890 回答
1

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

但是,您似乎没有main方法,因此如果它脱离了静态块,您的程序将会崩溃,并出现关于main找不到的异常。

于 2011-05-31T13:10:07.977 回答
0

某些东西一定已经加载了您的 SimpleTest 类,它一定是主线程(如当前线程的名称所示)。在没有看到调用代码的情况下,很难知道这里发生了什么——但是某些事情导致 SimpleTest 类被加载并且它正在主线程之外运行。

于 2011-05-31T13:13:00.067 回答
0

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

如果该类被另一个线程中的另一个类引用,则静态初始化将不会发生在主线程上,而是发生在第一次调用它的后台线程中。

于 2021-10-31T19:14:01.320 回答