4

このコードのスニペットと混同しています:

void stopTestThread() {

    // thread should cooperatively shutdown on the next iteration, because field is now null
    Thread testThread = m_logTestThread;
    m_logTestThread = null;
    if (testThread != null) {
      testThread.interrupt();
      try {testThread.join();} catch (InterruptedException e) {}
    }
  }

これは、testThreadとm_logTestThreadが異なるインスタンスであるが、メモリ内の同じオブジェクトを指しているため、同じスレッドであることを意味しますか?

もしそうなら、目的は何if (testThread != null)ですか?

4

2 に答える 2

3

これは、testThreadとm_logTestThreadが異なるインスタンスであるが、メモリ内の同じオブジェクトを指しているため、同じスレッドであることを意味しますか?

これは部分的に真実です。実際testThreadm_logTestThreadは、2つの異なるでreferencesはありませんinstancesThreadそして、両方の参照が同じオブジェクトを指しています。したがって、ポイントを作成するだけでreference m_logTestThreadは、参照もポイントになりnullません。testThreadnull

簡単な例で実際に見ることもできます:-

String str = "abc";
String strCopy = str;  // strCopy now points to "abc"
str = null;  // Nullify the `str` reference

System.out.println(strCopy.length()); // Will print 3, as strCopy still points to "abc"

したがって、参照の1つをnullに設定しても、他の参照は同じThreadオブジェクトを指します。0 referenceオブジェクトがポイントするか、が存在するまで、オブジェクトはガベージコレクションの対象にはなりませんcircular reference

このリンクを参照してください:-循環参照-正確に何であるかを知るためのwikiページCircular Refeference

「if(testThread!= null)」の目的は何ですか?

簡単だ。testThread参照がオブジェクトを指しているかどうかをチェックしているという条件から推測できnullます。これは、その参照が指すスレッドを中断しようとしている内部にnull check入らないようにするために行われます。したがって、その参照がを指している場合、割り込みするその参照に関連付けられたスレッドはありません。NPEif-constructnull

于 2012-11-15T06:38:06.750 に答える
0

これは、testThreadとm_logTestThreadが異なるインスタンスであるが、メモリ内の同じオブジェクトを指しているため、同じスレッドであることを意味しますか?

testThreadおよび は、オブジェクトm_logTestThreadの同じインスタンスを指す2つの参照です。Thread(Tと言う)

Thread testThread = m_logTestThread;

この行は、testThreadが指しているのと同じオブジェクトを指し始めることを意味しますm_logTestThread。つまり、両方ともTを指しています。

m_logTestThread = null;

この線は、m_logTestThreadがを指し始めることを意味しますnull。つまり、Tを指すことはなくなります。ただし、変更されず、testThreadTtestThreadを指し続けます。

「if(testThread!= null)」の目的は何ですか?

testThreadORがない可能性があるためnull、この条件は、を使用する前にさらに計算するために使用されtestThreadます。

于 2012-11-15T06:40:08.590 に答える