1

Runnableを実装するオブジェクトを作成し、それを使用してスレッドを開始すると...

ArrayList<Thread> threadlist = new ArrayList<Thread>();
{
  MergeThread mmt = new MergeThread();
  Thread t = new Thread(mmt);
  threadlist.add(mmt);
  t.start();
}

t.join();
Thread t = threadlist.get(0);

この時点で、mmtは存在することが保証されているか、ガベージコレクションがそれを取得した場合は存在しなくなった可能性があります。

私が求めているのは、スレッドが終了した後、ThreadオブジェクトがRunnableクラスを保持するかどうかです。

編集:上記に間違いがあり、threadlist.add(t);と表示されます。

4

3 に答える 3

3

クラスソースThreadから:

/**
 * This method is called by the system to give a Thread
 * a chance to clean up before it actually exits.
 */
private void exit() {
if (group != null) {
    group.remove(this);
    group = null;
}
/* Aggressively null out all reference fields: see bug 4006245 */
target = null;
/* Speed the release of some of these resources */
    threadLocals = null;
    inheritableThreadLocals = null;
    inheritedAccessControlContext = null;
    blocker = null;
    uncaughtExceptionHandler = null;
}

そのため、システムコールが呼び出され、 (スレッドが実行している実行可能ファイルである)Thread#exit()への参照が解放されます。target

bugs.sun.comには、参照のクリアについて言及しているバグレポート#4006245もありtargetます。

于 2012-06-04T21:54:49.410 に答える
2

mmtが追加されるthreadListので、それ自体が到達可能であり、それを保持している限り、ガベージコレクションは行われませんthreadList。これは、コード例の最後の行で、最初のt(中央のブロックの)がまだそれへの参照を保持しているかどうかに関係なく当てはまります。か否か。

于 2012-06-04T21:54:05.607 に答える
1

あなたが投稿したコードは私には本当に明確ではありません。ただし、

この時点で、mmtは存在することが保証されているか、ガベージコレクションがそれを取得した場合は存在しなくなった可能性があります。

私は次のように言うことができます:それでもそれを手に入れることができる場合ガベージコレクターはオブジェクトを再利用しません(そしてあなたがそれを手に入れることができない場合、オブジェクトがGCされたかどうかを心配する意味はありませんいいえ)。

于 2012-06-04T21:53:51.713 に答える