5

スレッドの実行時に例外が発生した場合、

  1. クリーンアップまたは何か他の必要がありますか?
  2. 何百ものスレッドを実行している場合、ガベージ コレクターを使用してメモリをクリーンアップできますか?

class MyThread extends Thread {

    public void run() {
        try {
            MyDAO dao = new MyDAO();
            List<Results> res = dao.findResults(...);
            ....
        } catch(Exception e) {
            //Do I need any clean up here
        }
    }
 }
4

3 に答える 3

4

ファイルなどのシステム リソースを開いている場合を除き、特定の cleanup は必要ありません。スレッドが終了するとすぐに、通常か例外かに関係なく、OS または VM (スレッド スタックなど) によってクリーンアップされます。

Threadオブジェクト自体はプレーンな Java GC によって回収されます。通常、GC はメモリが不足しているときにコレクションを実行します。ただし、決定論的ではありません。

一般的にメモリ効率を改善するには、スレッドをタスクとスレッド プールにリファクタリングすることを検討してください。これにより、スレッドあたり約 1 メガバイト (概算値!) を削減できます。

  • ExecutorServiceスレッドでの run タスクの実装。I/O ではなく主に CPU の作業を行っている場合は、通常、何百ものスレッドではなく、コアと同じ数のスレッドを使用することをお勧めします。既存の実装がありますが、独自のエグゼキュータ サービスを実装することもできます。
  • ACallable<T>はタスクの実装です。おそらく、オブジェクト以外で行っていることとかなり似ていRunnableます。
  • AFuture<T>は、タスクの結果に対する約束を保持します。
于 2013-05-03T12:28:11.903 に答える
2

オブジェクトは、参照がなくなると自動的にガベージ コレクションの対象となります。そのため、スレッドから他のオブジェクトから参照されているものが何もない限り、問題はありません。

Java のガベージ コレクション ( を使用System.gc()) は、ガベージ コレクションの発生を保証しないことに注意することが重要です。

于 2013-05-03T12:23:10.573 に答える