2011-05-31 103 views
3

我嘗試使用java時發現了一個非常有趣的事情。請看以下代碼:靜態塊和主線程

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

上述程序運行沒有任何異常(當然&好的,因爲我離開靜態塊本身)。但我得到了以下的輸出:

主要

因爲我還沒有開始主線程,它是如何得到建立。根據我的理解,靜態塊在加載期間執行。那麼主線程如何進入畫面?

任何人都可以請簡單介紹如何在jvm中完成編譯,加載和執行嗎?還使用rt.jar?

由於提前, Brinal

+0

關於其他問題(編譯,加載,執行,rt.jar):它們是不相關的,不屬於這裏。我建議你閱讀一些基本材料,然後*提出更具體的問題。 – 2011-05-31 13:11:26

回答

3

主類在主線程中加載並初始化。雖然這在任何地方都沒有明確記錄(據我所知),但這是一個非常安全的假設,因爲幾乎沒有理由以不同的方式實施它。

+0

@Joachim Sauer:對於我的知識:主類加載在主線程中,但是誰啓動郵件線程?它是JVM嗎? – 2011-05-31 13:11:54

+0

是的,JVM啓動該線程,與沒有靜態初始化塊時的方式完全相同。這裏唯一的區別是,在你通常*看到它之前,一些用戶代碼在它上面運行。 *通常,* main'線程的第一個符號是在'main' *方法*執行時。 – 2011-05-31 13:12:45

+0

@Joachim Sauer:這意味着無論是否存在主要方法,JVM都會爲類啓動線程。 – 2011-05-31 13:13:51

7

當您運行Java程序的主線程的第一個線程啓動。

您所看到的輸出並不表示main方法正在執行。相反,它是main線程

因此,無論何時你啓動一個Java程序,你都會有一個叫做主執行的線程。而且,如果該線程立即退出JVM,那麼這就是所有將運行的線程。

澄清:

按我理解靜塊時的負荷時間被執行。

靜態塊在加載類時執行。這是由類加載器發生的,並且在Java程序啓動時在主線程中執行。

+0

您的意思是說,在加載並在主線程啓動時執行該類時,會加載靜態塊。只需對 – Brinal 2011-05-31 14:39:53

+0

@Brinal進行分類,順序如下:主線程啓動,類加載,執行靜態塊。 (在所有的類都加載後,主要的方法會執行。) – jjnguy 2011-05-31 14:43:16

1

所有Java代碼都在某個線程上執行。通常(並且不出所料)主線程被命名爲「main」。通常,主線程加載主類(執行靜態塊),然後調用您的main方法。

但是,您似乎沒有main方法,因此如果它已經使其脫離靜態塊,那麼程序將崩潰,並且找不到關於main的異常。

0

某件事必須已經加載了您的SimpleTest類,它必須是主線程(如當前線程的名稱所示)。沒有看到調用代碼,很難知道這裏發生了什麼 - 但是導致SimpleTest類被加載並且它正在主線程運行。