English 中文(简体)
静态块和主线程
原标题:Static Block and Main Thread

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

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

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

主要的

Since I haven t started the 主要的thread, how does it got created. As per my understanding static block is executed during the load time. Then how does 主要的thread come into picture?

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

Thanks in advance, Brinal

最佳回答

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

问题回答

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

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

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

澄清:

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

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

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

但是,您似乎没有main方法,所以如果它从静态块中取出,您的程序就会崩溃,并出现未找到main的异常。

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

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

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





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签