[英]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.