4

Javaを試してみると、とても面白いことがわかりました。以下のコードを見つけてください:

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

上記のプログラムは例外なく実行されます(静的ブロック自体で終了しているので、問題ありません)。しかし、私は出力として次のものを取得しました:

主要

メインスレッドを開始していないので、どのようにして作成されましたか。私の理解によると、静的ブロックはロード時に実行されます。では、メインスレッドはどのように浮かび上がりますか?

誰かがjvmでコンパイル、ロード、実行がどのように行われるかを簡単に紹介できますか?また、rt.jarを使用しますか?

よろしくお願いします、ブリナル

4

5 に答える 5

7

Javaプログラムを実行すると、メインスレッドが最初に起動するスレッドになります。

表示されている出力は、main メソッドが実行中であることを示していません。むしろそれはmain スレッドです。

したがって、Javaプログラムを起動すると、main実行と呼ばれるスレッドが作成されます。そして、そのスレッドがすぐにJVMを終了する場合、これまでに実行されるすべてのスレッドです。

明確にするために:

私の理解によると、静的ブロックはロード時に実行されます。

静的ブロックは、クラスがロードされるときに実行されます。これはクラスローダーによって発生し、Javaプログラムの起動時にメインスレッドで実行されます。

于 2011-05-31T13:09:59.080 に答える
3

メインクラスはメインスレッドにロードされ、初期化されます。これは(私が知る限り)どこにも明示的に文書化されていませんが、別の方法で実装する理由はほとんどないため、かなり安全な仮定です。

于 2011-05-31T13:10:43.890 に答える
1

すべてのJavaコードはいくつかのスレッドで実行されます。通常(そして当然のことながら)メインスレッドの名前は「main」です。通常、メインスレッドはメインクラス(静的ブロックを実行する)をロードしてから、mainメソッドを呼び出します。

ただし、メソッドがないように見えるためmain、静的ブロックから抜け出せば、プログラムがクラッシュしますが、main見つからないという例外があります。

于 2011-05-31T13:10:07.977 に答える
0

何かがSimpleTestクラスをロードしている必要があります。これは、(現在のスレッドの名前が示すように)メインスレッドである必要があります。呼び出し元のコードを見ないと、ここで何が起こっているのかを知るのは困難ですが、何かが原因でSimpleTestクラスが読み込まれ、メインスレッドから実行されています。

于 2011-05-31T13:13:00.067 に答える
0

静的初期化は必ずしもメインスレッドで実行されるとは限りません

そのクラスが別のスレッド内の別のクラスから参照される場合、静的初期化はメインスレッドではなく、最初に呼び出されるバックグラウンドスレッドで発生します。

于 2021-10-31T19:14:01.320 に答える