【问题标题】:Static Block and Main Thread静态块和主线程
【发布时间】:2011-09-05 11:46:27
【问题描述】:

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

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

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

主要

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

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

提前致谢, 卤水

【问题讨论】:

  • 关于附加问题(编译、加载、执行、rt.jar):它们无关,不属于这里。我建议您阅读一些基本材料,然后然后提出更具体的问题。

标签: java jvm static-block


【解决方案1】:

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

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

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

澄清一下:

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

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

【讨论】:

  • 你的意思是说静态块是在加载类时加载并在主线程启动时执行的。只是为了澄清
  • @Brinal,顺序如下:主线程启动,类加载,静态块执行。 (类全部加载完毕后,将执行main方法。)
【解决方案2】:

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

【讨论】:

  • @Joachim Sauer:据我所知:主类已加载到主线程中,但谁启动邮件线程?是JVM吗?
  • 是的,JVM 启动该线程,与没有static 初始化程序块时的方式完全相同。这里唯一的区别是在你通常看到它之前,一些用户代码在它上面运行。 通常main线程的第一个迹象是main 方法被执行。
  • @Joachim Sauer:这意味着无论是否存在main方法,JVM都会为一个类启动线程。
  • @Harry:main 方法不会启动main 线程。它只是在其中运行
  • @Joachim Sauer:好的。感谢您的澄清。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-06-21
        • 1970-01-01
        • 1970-01-01
        • 2018-12-26
        • 2010-10-02
        • 1970-01-01
        • 1970-01-01
        • 2013-03-29
        • 1970-01-01
        相关资源
        最近更新 更多