0

オブジェクトの実行java.lang.Threadが終了した後もオブジェクトが存続する理由は何でしょうか。run()そして、この質問を理解するのを助けるために、スレッドはThreadGroupいつrun()行われるかからどのように削除されますか?

更新:生きているオブジェクトは、アクティブ/生きてThreadいるオブジェクトとは異なります。この質問をしたとき、私は(リークではなく)オブジェクトリークThreadをデバッグしていました。GNU Classpathに基づくJDKの場合(Harmonyはそのうちの1つである必要がありますか?)、コンストラクターに追加され、作成されたが開始されていないものがリークされます(つまり、終了しても存続します)。HotSpotでは、にが追加されていますが、これはより理にかなっているようです。つまり、起動した場合にのみ追加され、ハングしない場合は削除されることが保証されます。これはGCルートとして扱われることに注意してください。ThreadThreadThreadThreadGroupThread.<init>Threadrun()ThreadThreadGroupThread.start()run()ThreadGroup

4

2 に答える 2

2

run()スレッドが完了したときにどのような状況でスレッドが存続するのか、またはどのような状況でjava.lang.Threadオブジェクトが存続するのかを尋ねていますか?あなたの質問は後者を尋ねているようです。スレッドを制御することに加えて、Threadオブジェクトは他の人と同じGCルールに従う通常の古いJavaオブジェクトでもあることを覚えておくのがコツです。そのため、スレッドが完了してから長い時間が経過している場合でもThread、他のスレッドがインスタンスを保持していると、インスタンスがスタックする可能性があります(スレッドはGCルートです)。

簡単な例

Thread t = new Thread();
t.start(); // will finish almost instantly
t.join();
// ...

この例では、スレッドは開始と同時に、そして確実にjoin()戻るまでに終了しました。ただし、オブジェクトは、参照がスコープ外になるか、別のオブジェクトに設定されるまでThread、GCを存続します。t

コードを見ると、スレッドは、によって呼び出されるプライベートメソッドを介してそのThreadGroupから削除されThreadGroup.remove(Thread)ますThreadGroup.threadTerminated(Thread)。これは、によって呼び出されるパッケージプライベートメソッドThread.exit()です。これは、JDKコードで呼び出されないプライベートメソッドです。おそらく、ネイティブスレッド管理コードによって呼び出されます。

于 2013-01-18T08:19:59.557 に答える
0

スレッド オブジェクト メソッドの一部の関数呼び出しがrunまだ返されていない可能性があります。これは、実際には run メソッドがまだ終了していないことを意味します。

runメソッドの最後の行で「Finished」などを出力し、メイン プログラムのランタイムで出力を監視することをお勧めします。

于 2013-01-18T07:21:11.137 に答える