2

クラス(class Aたとえば)implementsがありRunnableます。run メソッドにはtry catch.Iがあります。threadこのように新しいキャッチを開始したい

new Thread(new A()).start();

これは例外を処理するための真の方法ですか?

ヒープがすぐにいっぱいになるので、おそらく危険な方法です。つまり、別のオブジェクトが作成されたばかりなので、garbage collectorこれをガベージしません。object

4

4 に答える 4

4

ヒープがすぐにいっぱいになるので、おそらくそれは危険な方法です。つまり、ガベージコレクターは、別のオブジェクトが作成されたばかりなので、このオブジェクトをガベージしません。

そのため危険ではありません。これが元のスレッドが終了する前に行う最後のことであると仮定するとnew Thread(new A()).start();、GCが必要になるまでに、元のスレッドは終了しているため、スタックの内容に到達できなくなります。まだ到達可能である唯一のスレッドは、それがまだ生きているスレッドになります。

ただし、新しいスレッドが計算を繰り返し、同じ例外を何度も何度もスローする可能性がある場合は危険です...したがって、このようなコードを作成する場合は、アプリケーションが保持することをお勧めします。スレッドが再起動される頻度を追跡し、頻繁に発生する場合はプラグを抜きます。

記述されたコードのもう1つの問題は、元のスレッドを起動したコードは、元のスレッドが停止していることを認識しているが、新しいスレッドについては認識していないことです。これは、ワーカースレッドを中断してシャットダウンを開始する場合に問題になります。

これらの2つの問題(およびその他の問題)をまとめると、元のスレッドを起動したコードが再起動を担当する方が適切です。

于 2012-09-02T13:42:21.347 に答える
3

スレッドは新しい並列軽量プロセスです。run メソッドが完了するとすぐに、GC の対象になります。オブジェクトが開始された場所からのオブジェクトのGCライフサイクルに影響を与えるとは思いません。

あなたの場合の唯一の新しいことは、スレッドで例外を処理することです。なぜこれが必要なのかについての詳細を知らなければ、それが安全で良い習慣であるかどうかを判断するのは困難です。

于 2012-09-02T13:17:03.210 に答える
2

これは、スレッド内で例外を処理する良い方法ではありません。同じタイプの新しく作成されたスレッドに同じ例外がないのはなぜですか?

あなたがすべきことは、古いスレッドが失敗したときに新しいスレッドを監視し、処理し、必要に応じて再作成する、スレッドからレベルを上げた何らかの形式のスレッドマネージャーを用意することです。

これにより、エラーを処理する方法をさらに追加できるようになり、スレッドをデバッグしてみると見栄えがよくなります。これらすべてのスレッドがぶら下がっているのではなく (親が GC によってクリーンアップされたため)、すべてのスレッドが同じ場所から生成されたことがわかります。

スレッドは実行が終了するとGCされるため、提案しているものはヒープを乱雑にしません。

于 2012-09-02T13:19:00.120 に答える
1

作成したスレッドへの参照を保存していない場合は、終了時に GC によってクリーンアップされます。あなたの場合、 run() メソッド内で新しいスレッドを開始するのはかなり安全だと思います。

内部クラスを作成したり、このスレッド インスタンスを格納したりしていないことを確認してください。もちろん、メモリ リークが発生する可能性があります。

幸運を

于 2012-09-02T13:15:14.773 に答える