スレッドの run メソッドはThread.start()
、プログラマーによって呼び出されると、JVM によって呼び出されます。
JVM は を呼び出す前にバックグラウンドで何をし
Thread.run()
ますか?Thread.run()
ユーザーに公開されないのはなぜですか?
スレッドの run メソッドはThread.start()
、プログラマーによって呼び出されると、JVM によって呼び出されます。
JVM は を呼び出す前にバックグラウンドで何をしThread.run()
ますか?
Thread.run()
ユーザーに公開されないのはなぜですか?
JVM は を呼び出す前にバックグラウンドで何をし
Thread.run()
ますか?
スレッド オブジェクトを管理する JVM の作業 (スタック スペースの割り当て、スレッド ローカルなど) と、新しいスレッド/プロセス/クローンの分岐とスケジューリング、またはアーキテクチャがスレッドの実装に使用するものは何でも、アーキテクチャごとのネイティブ作業を行います。
Thread.run()
ユーザーに公開されないのはなぜですか?
スタックフレームに関して「露出」について話していると思います。静的メソッドと同様に、main
明らかにユーザー コードの上に呼び出しフレームがありますが、それらは役に立たず、混乱を招くため、ユーザーに公開されていません。Thread.run()
メソッドについても同じことが言えます。拡張してオーバーライドするとコール スタックに表示されますが、target を渡す場合は表示されません。Thread
run()
Runnable
この回答には、これに関する多くの詳細があります。
Thread.run() を呼び出す前に、JVM はバックグラウンドで何をしますか?
Thread
start() を呼び出すと、スレッドの run() メソッドを呼び出すオブジェクトに関連付けられたスレッドが開始されます。
注: スレッドの作成、開始、およびスケジューリングのすべての作業は、OS によって行われます。Java は適切なシステム コールを行うだけです。実際の作業を行うのは JVM コードではありません。
または Thread.run() がユーザーに公開されないのはなぜですか?
露出しています。これは公開されており、他のメソッドと同じように呼び出すことができます。
thread.run() で開始すると、これは通常のプロセスとして実行され、実際にはスレッドとして使用されません。メインスレッドと結合されます。thread.start() を使用すると、JVM はメイン スレッドと結合されない別のスレッドを割り当てます。
を呼び出すstart()
と、Thread
クラスは実際に新しい JVM スレッド (呼び出しスレッドとは別のもの) を作成し、その新しいスレッドから呼び出しrun()
ます。
アプリケーションコードが実行中のコードの複数のスレッドを持つことができるように、新しい JVM スレッドを作成することは、低レベルの JVM 操作です。
run()
がユーザーに公開され、 の代わりに呼び出された場合start()
、 のコードrun()
は単一の呼び出しスレッドでシリアルに実行されます。
someThread.start()
新しいスレッドを作成するように JVM に指示するネイティブ メソッドを呼び出します。たとえば、ホットスポットの悲惨な詳細は、ソース コードで確認できます。
実際には、OS に新しいスレッドを作成するように要求し、その新しく作成されたスレッドでメソッドをstart()
呼び出します。Thread#run()
新しいスレッドの起動にはオペレーティング システムとの対話が必要なため、JVM 自体の実装を詳しく調べ始めています。これは、JVM のスレッドに関する中間レベルのかなり適切な説明です。