2

スレッドが動作を完了した後、スレッド参照を明示的にnullに設定する必要がありますか、それとも不要ですか?nullとして設定したい場合は、コードのどこでこれを行う必要がありますか?

スレッドが生きているかthread.isaliveフラグを使用していないかを確認し、生きていない場合はnullに設定する必要がありますか?

4

2 に答える 2

3

スレッドは他のオブジェクトと同じように扱う必要があります。
参照は、必要な場合にのみ保持してください(たとえば、Join())。

スレッドの長寿命の参照がある場合(つまり、静的フィールドにある場合)、null不要になったときに設定する必要があります。しかし、そのような変数を持っていない方がはるかに良いです。

于 2012-05-20T07:38:35.463 に答える
3

スレッドが動作を完了した後、スレッド参照を明示的にnullに設定する必要がありますか、それとも不要ですか?

個人的には気にしない。とにかく、オブジェクト参照をnullに明示的に設定することが本当に重要な場合がいくつかあります。タイプに関係なく、これらのケースは次のとおりです。

  • 変数が静的メンバーであり、それが参照するオブジェクトが大量のメモリを消費する場合。
  • 変数が、大量のメモリを消費するオブジェクトを参照する、より寿命の長いオブジェクト内に含まれるインスタンスメンバーである場合。
  • 変数が、大量のメモリを消費するオブジェクトを参照する長時間実行メソッドのローカルである場合。1

それらは私が考えることができたものです。おそらくもっとありますが、おそらく多くはありません。ここでの一般的な分母は、変数が大量のメモリを消費するオブジェクトを参照することです。管理対象オブジェクト自体は多くのメモリを消費しないため、型の変数をnullに設定すると、使用方法に関係なく、多くのことを達成Threadできるとは想像できません。Threadほとんどのリソースは、スレッドの開始時に割り当てられ、スレッドの終了時に割り当てが解除されます。

スレッドが生きているかどうかを確認し、thread.isaliveフラグを使用していない場合は、nullに設定する必要があります。

Thread.Join私はスレッドのテストと完了を待つために使用することを好みます。実際、私はこれまでに有用なものに使用したことはありません。Thread.IsAlive


1 GCは実際には、参照が使用されなくなったことを検出できる場合、メソッドが終了する前にローカルオブジェクト参照を破棄するのに十分スマートです。

于 2012-05-21T02:17:00.563 に答える