繁体   English   中英

Static 块和主线程

[英]Static Block and Main Thread

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

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

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

主要的

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

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

在此先感谢,布林纳

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

您看到的 output 并不表示main方法正在执行。 相反,它是main线程

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

澄清:

据我了解,static 块在加载期间执行。

static 块在加载 class 时执行。 这由 class 加载程序发生,并在 Java 程序启动时在主线程中执行。

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

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

但是,您似乎没有main方法,因此如果它从 static 块中取出,您的程序将会崩溃,并出现关于找不到main的异常。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM