有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java静态块和主线程

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

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

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

main

因为我还没有启动主线程,它是如何创建的。据我所知,静态块是在加载期间执行的。那么主线是如何进入画面的呢

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

提前感谢,, 海水的


共 (5) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

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

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

    所以,只要启动Java程序,就会有一个名为main executing的线程。而且,如果该线程立即退出JVM,那么这就是将要运行的所有线程

    为了澄清:

    As per my understanding static block is executed during the load time.

    静态块在类加载时执行。这是由类加载器实现的,当Java程序启动时,会在主线程中执行

  3. # 3 楼答案

    一定有什么东西加载了SimpleTest类,它一定是主线程(如当前线程的名称所示)。如果看不到调用代码,就很难知道这里发生了什么——但是有什么东西导致SimpleTest类被加载,并且它正在脱离主线程

  4. # 4 楼答案

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

  5. # 5 楼答案

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

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