4

スレッドの run メソッドはThread.start()、プログラマーによって呼び出されると、JVM によって呼び出されます。

  1. JVM は を呼び出す前にバックグラウンドで何をしThread.run()ますか?

  2. Thread.run()ユーザーに公開されないのはなぜですか?

4

6 に答える 6

6

JVM は を呼び出す前にバックグラウンドで何をしThread.run()ますか?

スレッド オブジェクトを管理する JVM の作業 (スタック スペースの割り当て、スレッド ローカルなど) と、新しいスレッド/プロセス/クローンの分岐とスケジューリング、またはアーキテクチャがスレッドの実装に使用するものは何でも、アーキテクチャごとのネイティブ作業を行います。

Thread.run()ユーザーに公開されないのはなぜですか?

スタックフレームに関して「露出」について話していると思います。静的メソッドと同様に、main明らかにユーザー コードの上に呼び出しフレームがありますが、それらは役に立たず、混乱を招くため、ユーザーに公開されていません。Thread.run()メソッドについても同じことが言えます。拡張してオーバーライドするとコール スタックに表示されますが、target を渡す場合は表示されませんThreadrun()Runnable

この回答には、これに関する多くの詳細があります。

Java run() メソッドはどのように機能しますか?

于 2012-12-19T18:50:51.060 に答える
1

Thread.run() を呼び出す前に、JVM はバックグラウンドで何をしますか?

Threadstart() を呼び出すと、スレッドの run() メソッドを呼び出すオブジェクトに関連付けられたスレッドが開始されます。

注: スレッドの作成、開始、およびスケジューリングのすべての作業は、OS によって行われます。Java は適切なシステム コールを行うだけです。実際の作業を行うのは JVM コードではありません。

または Thread.run() がユーザーに公開されないのはなぜですか?

露出しています。これは公開されており、他のメソッドと同じように呼び出すことができます。

于 2012-12-19T20:16:04.807 に答える
0

thread.run() で開始すると、これは通常のプロセスとして実行され、実際にはスレッドとして使用されません。メインスレッドと結合されます。thread.start() を使用すると、JVM はメイン スレッドと結合されない別のスレッドを割り当てます。

于 2012-12-19T18:45:07.887 に答える
0

を呼び出すstart()と、Threadクラスは実際に新しい JVM スレッド (呼び出しスレッドとは別のもの) を作成し、その新しいスレッドから呼び出しrun()ます。

アプリケーションコードが実行中のコードの複数のスレッドを持つことができるように、新しい JVM スレッドを作成することは、低レベルの JVM 操作です。

run()がユーザーに公開され、 の代わりに呼び出された場合start()、 のコードrun()は単一の呼び出しスレッドでシリアルに実行されます。

于 2012-12-19T18:46:04.467 に答える
0

someThread.start()新しいスレッドを作成するように JVM に指示するネイティブ メソッドを呼び出します。たとえば、ホットスポットの悲惨な詳細は、ソース コードで確認できます。

実際には、OS に新しいスレッドを作成するように要求し、その新しく作成されたスレッドでメソッドをstart()呼び出します。Thread#run()

于 2012-12-19T18:55:38.573 に答える
0

新しいスレッドの起動にはオペレーティング システムとの対話が必要なため、JVM 自体の実装を詳しく調べ始めています。これは、JVM のスレッドに関する中間レベルのかなり適切な説明です。

于 2012-12-19T19:04:13.313 に答える